はじめに
C++BuilderでOpenCVが利用できるのは、
OpenCV1のみと言うのが通説の様ですが、
もっと新しいバージョンのOpenCVを使いたいと思い、
色々探した結果、OpenCV-RSで成功したので、
その手順を記載します。
システム要件
必要なソフトウェアを記載します。
・Windows10または11の64ビット版
・C++Builder10.2以上(コミュニティエディションも可)
・Windows版cmake(GUI対応)
・Windows版git
C++Builderの最新コミュニティエディションの取得は以下のリンクを参照
cmake(Windows)は以下のリンクを参照(Windows x64 Installer:)
git(Windows)は以下のリンクを参照
それぞれのソフトウェアをセットアップしておきます。
OpenCV-RSリポジトリ(GitHub)のクローン
OpenCV-RSリポジトリを開く
コマンドプロンプトを開き、リポジトリからクローンしたい
ディレクトリに移動
(例)
c:
cd
mkdir OpenCV
cd OpenCV
OpenCV-RSのリポジトリのCode▼(緑色のボタン)をクリックして、
コピーボタンをクリックして、URLをクリップボードにコピー
コマンドプロンプトに
git clone␣
と入力して、右クリックで先ほどのURLを貼り付ける。
エンターキー押下でクローン実行。
cmake(windows)でビルド環境構築
ほとんどの手順はOpenCV^RSのREADME.mdに記載されていますが、
概略は以下の様になります。
cmake(windows)を起動します。
Where is the ... にクローンして出来たopencv_3.2.0フォルダのパスをセットします。
opencv_3.2.0フォルダの下に、buildフォルダを作成します。
where to build ... に作成したbuildフォルダのパスを設定します。
Cnfigreボタンをクリックして表示される画面で、
Borland Makefilesを選択して、Specify native compilersをチェックして、
Finishをクリックします。
コンパイラのパスを設定します。
コンパイラは「bcc32c.exe」のパスを指定します。
(32c以外は不可ですので注意してください)
その上で
WITH_WEBP
WITH_JASPER
WITH_IPP
WITH_OPENEXR
BUILD_TESTS
BUILD_PERF_TESTS
BUILD_SHARED_LIBS
のチェックを外します。
OPENCV_ENABLE_NONFREE
をチェックして、
OPENCV_EXTRA_MODULES_PATH
に opencv_contrib_3.2.0\modules のパスを設定します。
【重要】
opencv_3.2.0\cmake\OpenCVCompilerOptions.cmake
の21と22行目の左端に#を入れてコメントアウトする。
else()
message(STATUS "Looking for ccache - not found")
# else()
# message(STATUS "Looking for ccache - not found")
※当方の判断で変更していますが、エビデンスはありません。この変更をしないとCnfigreが正常終了しません。
この状態で、再度Cnfigreボタンをクリックします。
Configuring done と表示されれば正常終了です。
上手く行かない場合は、ここまでの設定を見直して、
設定漏れがないかチェックしてください。
Cnfigre後、以下のオプションのチェックを外します。
BUILD_PROTOBUF
BUILD_opencv_dnn
BUILD_TIFF
WITH_TIFF
Generateボタンをクリックします。
Generating done と表示されれば、正常終了です。
上手く行かない場合は、ここまでの設定を見直して、
設定漏れがないかチェックしてください。
OpenCVをビルドする
コマンドプロンプトを開いて、opencv_3.2.0\build に移動する。
make コマンドを実行する。
OpenCVのライブラリのビルドが開始されます。
100%まで行けばビルド成功です。
次にビルドした
ビルドが途中で異常終了する場合は、
これまでの設定を再確認するか、
対象のモジュールをビルドから外します。
上図の場合は、flann モジュールがコンパイルエラーを起こしているので、
BUILD_opencv_flann のチェックを外して、
CnfigreとGenerateを再度実行します。
モジュールのビルドをスキップするか等の処置は、
法則があるわけでないので、
その場で臨機応変に対応して下さい。
ビルドが正常終了した後は
make install
コマンドで、生成されたライブラリをインストールします。
OpenCVをC++Builderのプロジェクトで使用(サンプル)
C++BuilderのVCLアプリケーションプロジェクトで、
メニューの「プロジェクトに追加」で、
build\install\staticlib 以下の.libファイルを全て選択して、
プロジェクトに追加して下さい。
※コンソールアプリではリンカーエラーが多発して動きません。
インクルードパスに
....\build\install\include
対応するパスを追加してください。
フォームにボタンを一つ配置して、
ボタンをダブルクリックして、OnClickイベントにコードを記述します。
その他インクルードなどを含めた全体のコードは以下になります。
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <opencv2/opencv.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
cv::namedWindow("lena");
cv::namedWindow("test");
cv::Mat img = cv::imread("lena.jpg",-1);
cv::Mat gray;
cv::Mat th;
cv::Mat bin_img;
cv::cvtColor(img,gray,cv::COLOR_RGB2GRAY);
cv::threshold(gray,th,128,255,cv::THRESH_BINARY);
cv::Canny(th,bin_img,100,200);
std::vector<std::vector<cv::Point> > contours;
cv::findContours(bin_img,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
cv::Mat cnt_img = cv::Mat::zeros(bin_img.rows,bin_img.cols, CV_8UC3);
cv::drawContours(cnt_img,contours,-1, cv::Scalar(0,255,0));
cv::imshow("lena",img);
cv::imshow("test",cnt_img);
cv::waitKey(0);
cv::destroyAllWindows();
}
//---------------------------------------------------------------------------
これでビルドを行い出来たproject1.exe と同じフォルダに
定番の「len.jpg」を配置します。
プログラムを実行して、
ボタンをクリックすると、
原画と輪郭の画像が表示されます。
何かキーを押下すると、プログラムは終了します。
これでC++BuilderでOpenCV 3.2 が利用可能になります。
64ビットへの対応
64ビットプロジェクトへの対応を次回説明します。
現在、ある程度は利用できるところまで来ているので、
安定して利用できるようになったら、
64ビット編を作成します。
以上