忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

RaspberryPiにてOpenCVをC++でビルド

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_imgcodecs


OpenCV4系の場合

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/build

cmake設定を追加します。

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 install
sudo ldconfig

これで/usr/local/lib/pkgconfig下に設定用ファイル
OpenCV3系:opencv.pc
OpenCV4系: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ビルド設定を行います。
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント