RaspberryPi(Raspbian)にてOpenCVのC++サンプルコードをビルドする方法です。
サンプルフォルダにCPP(C++)のサンプルがありますがビルドには少し設定が必要です。
Raspbianでの操作手順はUbuntuでの操作手順と同様です。
参考:Qiita@t13m082h様
pkg-configを使ってg++でコンパイルできるようになるまで※2021/04/11 pkg-configの使い方を追記※2022/02/25 cpp_test.cppの return の綴りが間違っていたので修正基本的な環境設定はPython向けと同じです。
ここでは
Python向けにOpenCVがインストールできたものとします。
ラズパイでのC++ビルド環境はいくつかある様ですがg++を使ってみます。
※gccだと別のトラブルが出ます
C++でHello Wold
ラズパイでのC++ビルドはほとんど経験が無いのでOpenCVを使う前にHello Woldをしておきます。
とりあえずファイルマネージャーで/home/piを開いて
右クリックで新規ファイル
ファイル名はcpp_test.cppとしておきます
cpp_test.cppを開きます
素の設定だとGeanyで開くと思います。
cpp_test.cppへ以下を記述
#include <stdio.h>
int main(){
printf("Hello World\n");
return 1;
}
Geanyでもビルドできるのでビルドしてみます。
ビルドからbuild
Geanyでビルドすると/home/piにcpp_testが作成されます。
ビルドしたプログラムを実行するには
ターミナルで
./cpp_test Geanyでビルドできることを確認しました。
続いてg++でビルドします。
g++でビルドする際はターミナルで"g++ ビルドするファイル名"を実行します。
g++ cpp_test.cpp今度は/home/piに
a.outが生成されます。
g++でビルドするとファイル名に関わらず
a.outが生成されます。
とりあえず実行しておきます。
./a.out a.outでは後で区別がつかないので出力ファイル名を変更します。
出力ファイル名は
-o ファイル名
で指定します。
g++ cpp_test.cpp -o cpp_test.out今回はcpp_test.outが生成されました。
出力ファイル名はcpp_testでも構わないのですが拡張子が無いとcpp_testがcpp_test.cppなのか出力されたファイルなのか混同する可能性があるのでとりあえず.outをつけておくことにします。
実行
./cpp_test.out ひとまずgccでビルドできることを確認しました。
OpenCVサンプルのビルド
g++のビルドを確認できたのでOpenCVサンプルコードをビルドします。
とりあえずそのままビルドするとどうなるか試してみます。
CPPサンプルフォルダへ移動して
cd ~/opencv/samples/cppビルド
g++ facedetect.cpp残念ながらビルドできません。
OpenCV3系でも4系でもビルドできない事に違いはありませんが3系と4系で症状が違います。
4系限定?ヘッダファイルが見つからない
OpenCV 4系(4.5.0)で試した場合
そのようなファイルやディレクトリはありません。ビルドするファイルによって
・opencv2/highgui.hpp
・opencv2/core.hpp
・opencv2/objdetect.hpp
・opencv2/tracking.hpp
など見つかりません
VisualStudioでいうところのインクルードディレクトリが設定されていない様な状態です。
※OpenCV3系ではこのエラーは出ません。
※4系でもバージョンによって挙動が違うかもしれません。
そもそもヘッダファイルはどこ?/home/pi/opencv/include/opencv2を見ても該当するヘッダファイルはありません。
ヘッダファイルはOpenCVが3系の場合は
/usr/local/include/opencv2にあり、/usr/local/include/まではパスが通っている(インクルードディレクトリとして設定されている)様で設定を変えてなくも読めるのですが、
OpenCVが4系の場合
/usr/local/include/opencv4/opencv2とよくわからない事になっており読めません。
サンプルプログラムの
#include "opencv2/highgui.hpp"を
#include "opencv4/opencv2/highgui.hpp"等に書き換えるとhighgui.hpp自体はincludeできますが、highgui.hppが別のopencv2
フォルダの別のファイルを参照しているので結局ビルドは通りません。
フォルダ構成を
/usr/local/include/opencv4/opencv2から
/usr/local/include/opencv2へ変更してしまえばそれはそれで解消できますが後で問題になるかもしれないのでやめときます。
g++でビルドする際にインクルードディレクトリを指定するオプションがあります。
ディレクトリを追加するには
-I(
大文字の’i’ ) フォルダの場所
とします
※Iとフォルダの場所の間の半角スペースはあっても無くても可
g++ facedetect.cpp -I /usr/local/include/opencv4これで「
そのようなファイルやディレクトリはありません」は解消されます。
ライブラリが見つからない
ヘッダがみつかると別のエラーが出ます。※OpenCV3系4系共通
undefined reference to 'cv::VideoCapture::VideoCapture()'とかがいっぱい出てきます。
今度はVisualStudioでいうところのリンカが設定されていない(ライブラリが見つからない)状態です。
python向け設定で環境設定済みの場合ライブラリは/usr/local/libに格納されています。
これはOpenCV3系でも4系でも同じです。
ここに大量にあるlib***.soがunix系のライブラリです。
windowsで言うところの*.libとか、*.dllとかに相当します。たぶん。
どうやらこちらはパスが通っているので、使用するライブラリを指定していけばいい様です。
ライブラリを指定するには
-l(
小文字の’L’) ファイル名
とします。
※lとファイル名の間の半角スペースはあっても無くても可
また、ファイル名は先頭の”lib”と最後の”.so”を省略できるらしいです。
※参考:Qiita@seriru13様gcc
コンパイルオプション備忘録では、ライブラリを追加してみます。
必要となるライブラリは
includeしたヘッダに対応したものと、
ビルドした時に要求されるもの(多くの場合
opencv_coreが必要)
OpenCV3系の場合
g++ facedetect.cpp -l opencv_core -l opencv_objdetect -l opencv_highgui -l opencv_imgproc -l opencv_videoio -l opencv_imgcodecsOpenCV4系の場合
g++ facedetect.cpp -I /usr/local/include/opencv4 -l opencv_core -l opencv_objdetect -l opencv_highgui -l opencv_imgproc -l opencv_videoio -l opencv_imgcodecs これでビルドできました。
実行もできています。
ビルド設定をまとめたファイル
makeした環境に応じてビルド時に必要な設定は変わってきます。
一個づつ入力することもできますが
pkg-config用ファイルがあればまとめて設定できます。
何かの条件次第では最初からpkg-config用ファイルが生成されてたりする様です。
cmakeの設定を変えてmakeし直すことでpkg-config用ファイルを出力することができます。
※一度自前でmake済みであればpkg-config設定の変更だけならmakeは数分で終わります。
buildフォルダへ移動して
cd ~/opencv/buildcmake設定を追加します。
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D BUILD_EXAMPLES=ON -D OPENCV_GENERATE_PKGCONFIG=ON .. あとは
make -j4 sudo make installsudo ldconfigこれで/usr/local/lib/pkgconfig下に設定用ファイル
OpenCV3系:
opencv.pcOpenCV4系:
opencv4.pcが出力されました。
※2021/04/11 追記
pkg-configを使う
生成されたファイルの使い方は再度
Qiita@t13m082h様の記事を参照して頂ければと思います。
生成されたpkg-configファイルを使用するには
1)pkg-configファイルのパスを指定する
2)ビルド時にpkg-configファイルを指定する
の手順が必要ですが、先の手順にて自分でmake、build、install、ldconfigを実行すればパスの
指定が自動的に行われるようです。したがってビルド時にファイルを指定するだけでOKです。
改めてCPPサンプルフォルダへ移動して
cd ~/opencv/samples/cppビルド
g++ facedetect.cpp -o facedetect.out `pkg-config --cflags --libs opencv4`※注意 pkg-configを囲む
` は
shift+7で入力する
'ではなく、
shift+@で入力する
`です
これでビルドできました。
./facedetect.outにて実行できます。
いちいちコマンドを入力するのが面倒なので次回は
GeanyのOpenCVビルド設定を行います。