前回はg++を使ってOpenCVをビルドしました。
また、pkg-configファイも生成しました。
ただ、毎回ターミナルでディレクトリ移動やらファイル名を入力してビルドやら面倒くさいです。
標準でインストールされているGenay等使ってマウス操作(GUI)でビルド出来ないかと。
ありました。
参考:OpenCV画像解析入門様
Geanyエディタで開発環境を整える参考サイト様によればビルドコマンド設定にて任意のコマンドを実行できる様です。
ついでにc++ビルドでもpython同様に
OpenCV処理の高速化を図ります。
Geanyの設定確認
まずGeanyにてOpenCVがビルドできるように設定を変更します。
とりあえず前回ビルドしたc++向けのサンプルファイルをGeanyで開きます。
設定を何も変えていなければダブルクリックでGeanyが起動するはずです。
ビルドから
ビルドコマンドを設定項目にある
・Build:ビルド
・Execute:ビルドしたファイルの実行
の設定を変更します。
まずは標準設定で何をしているかの確認から
Build:
g++ -Wall -o "%e" "%f"Execute:
"./%e"前回ターミナルへ手打ちしたコマンドと比較すればなんとなく分かります。
詳細についてはヘルプで確認できます。
<解説>ビルドコマンド
g++ :g++でビルド
-Wall :ビルド時に警告などを表示する(
-wでも可)
-o "%e" :出力ファイル名の指定(%e 拡張子なしのファイル名を適用)
"%f" :ビルドするファイルを指定(%f 拡張子ありのファイル名を適用)
例えばfacedetect.cppをビルドするなら
g++ -Wall -o "facedetect" "facedetect.cpp"を実行したのと同じになります
実行コマンド
"./%e":実行するファイルを指定
例えばfacedetect.cppをビルド後に実行するなら
"./facedetect"を実行したのと同じになります
ビルドコマンドの設定変更
機能を理解したところで設定を変更します。
前回のターミナル入力では生成したpkg-configファイを
`pkg-config --cflags --libs opencv4`等
でビルド時に指定すればOpenCVをビルドできました。
※OpenCV3系とOpenCV4系でファイルが異なります
ということで最後に
`pkg-config --cflags --libs opencv4`を追加すればOKです。
ビルド生成するファイル名を
*.outにしたいので、
-o "%e"を
-o "%e.out"へ変更しておきます。
これに合わせて実行コマンドを
"./%e"から
"./%e.out"へ変更します。
初期設定に戻したいときは右にあるハケのボタンを押して下さい。
ではビルドしてみます。
ファンクションキーが使える場合はF9でもOKです。
指定したコマンドが実行されていることが分かります。
これでビルドできました。
Executeにて実行もできます。
ラズパイ4でも検索に170ms以上かかっており処理が少々遅いです。
OpenCVの高速化設定
Python向けに高速化設定を行っていますが、c++でも設定してみます。
今回は
facedetect.cppをベースにして
・読み込み画像サイズ指定
・バッファ指定
・処理サイズ指定
これに加え
・顔検索の縮尺設定変更
を行います。
c++の場合
cv::CAP_PROP_BUFFERSIZE 等の書き方をしますが標準サンプルでは冒頭で
using namespace cv;を設定してあるので
cv::を省略することも出来ます。
まずは
・読み込み画像サイズ指定
・バッファ指定
を変更します
facedetect.cppでは
VideoCapture capture;にてビデオキャプチャを確保し
capture.open(camera))にてカメラを起動しています。
※サンプル次第では
captureの代わりに
capになってたりします。
これに合わせて100行目付近の
if(
caputure.isOpened() )の条件の中に
capture.set(cv::CAP_PROP_BUFFERSIZE,1);capture.set(cv::CAP_PROP_FRAME_WIDTH,640);capture.set(cv::CAP_PROP_FRAME_HEIGHT,480);を追加します。
続いて
・処理サイズ指定
を変更します。
facedetect.cppではcv::CommandLineParser機能を使っておりファイル実行時に
./facedetect.out -scale=2等と指定すれば1/2サイズで検索できるように作られています。
今回は引数を入力したくないので、ソース内で直接指定しておきます。
60行目付近で
scale = parser.get<double>("scale");を
scale=2としてしまいます。
マルチスケール検索設定
これでPython版と同じ改良をしましたが、cpp版とpython版で検索条件が少し違います。
facedetect.cppではマルチスケール検索で倍率を変更しながら顔を検索しています。
cpp版では1.1倍、python版では1.3倍でスケールを変更しています。
1.1倍から1.3倍にすると多少検索精度が落ちますが検索回数が減って高速化します。
検索物同士の最小距離も違うのでこれもpython版に合わせておきます。
200行目付近のcascade.detectMultiScaleの引数を
1.1, 2, 0を
1.3, 4, 0へ変更します。
これで検索に170ms以上かかっていた処理が23ms程度まで改善します。
※この数値はfps値ではないので注意
scale=2では小さな顔を検出できないので条件に合わせて調整して下さい。