C++BuilderでOpenCV3.2を使えるようにする(32ビット編)

# はじめに
C++BuilderでOpenCVが利用できるのは、
OpenCV１のみと言うのが通説の様ですが、
もっと新しいバージョンのOpenCVを使いたいと思い、
色々探した結果、OpenCV-RSで成功したので、
その手順を記載します。

# システム要件

必要なソフトウェアを記載します。

・Windows10または11の64ビット版
・C++Builder10.2以上(コミュニティエディションも可)
・Windows版cmake(GUI対応)
・Windows版git

C++Builderの最新コミュニティエディションの取得は以下のリンクを参照

https://www.embarcadero.com/jp/products/cbuilder/starter

cmake(Windows)は以下のリンクを参照(Windows x64 Installer:)

https://cmake.org/download/

git(Windows)は以下のリンクを参照

https://gitforwindows.org/

それぞれのソフトウェアをセットアップしておきます。

# OpenCV-RSリポジトリ(GitHub)のクローン

OpenCV-RSリポジトリを開く

https://github.com/IgorYunusov/OpenCV-RS

コマンドプロンプトを開き、リポジトリからクローンしたい
ディレクトリに移動

(例)
c:
cd \
mkdir OpenCV
cd OpenCV

OpenCV-RSのリポジトリのCode▼(緑色のボタン)をクリックして、
コピーボタンをクリックして、URLをクリップボードにコピー

コマンドプロンプトに

git clone␣

と入力して、右クリックで先ほどのURLを貼り付ける。

![git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/b9527c01-a6bf-2c68-1868-abec63a01278.png)

エンターキー押下でクローン実行。

# cmake(windows)でビルド環境構築

ほとんどの手順はOpenCV^RSのREADME.mdに記載されていますが、
概略は以下の様になります。

cmake(windows)を起動します。

![cmake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/cda19910-f418-0bdb-71e4-c56eff3a09ca.png)

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以外は不可ですので注意してください)

![cmake2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/d12589ed-3cd2-7d17-c5ca-a2edc6fc4379.png)

その上で

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行目の左端に#を入れてコメントアウトする。

```cmake:OpenCVCompilerOptions.cmake 21～22行目変更前
    else()
      message(STATUS "Looking for ccache - not found")
```
```cmake:OpenCVCompilerOptions.cmake 21～22行目変更後
#    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 コマンドを実行する。

![bild.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/e335eecf-6611-4ec4-8459-ba61413f7de8.png)

OpenCVのライブラリのビルドが開始されます。
100%まで行けばビルド成功です。

次にビルドした

ビルドが途中で異常終了する場合は、
これまでの設定を再確認するか、
対象のモジュールをビルドから外します。
![bild2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/212645b5-b0c0-b69a-c7e0-6beaed311446.png)

上図の場合は、flann モジュールがコンパイルエラーを起こしているので、
BUILD_opencv_flann のチェックを外して、
CnfigreとGenerateを再度実行します。

モジュールのビルドをスキップするか等の処置は、
法則があるわけでないので、
その場で臨機応変に対応して下さい。

ビルドが正常終了した後は

make install

コマンドで、生成されたライブラリをインストールします。

# OpenCVをC++Builderのプロジェクトで使用(サンプル)

C++BuilderのVCLアプリケーションプロジェクトで、
メニューの「プロジェクトに追加」で、
build\install\staticlib 以下の.libファイルを全て選択して、
プロジェクトに追加して下さい。

![lib.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/e46cf352-d735-bcba-817a-585daeea0557.png)


※コンソールアプリではリンカーエラーが多発して動きません。

インクルードパスに

....\build\install\include

![include.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/4848e1a5-86a2-4ba8-20e8-3cff425b214b.png)


対応するパスを追加してください。

フォームにボタンを一つ配置して、
ボタンをダブルクリックして、OnClickイベントにコードを記述します。
その他インクルードなどを含めた全体のコードは以下になります。

```C++:Unit1.cpp
//---------------------------------------------------------------------------

#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」を配置します。

![lena.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/ce214c1d-309c-2d37-47e9-de290daeac11.jpeg)

プログラムを実行して、
ボタンをクリックすると、
原画と輪郭の画像が表示されます。

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883019/0bbc9181-e839-99ce-e919-a10f3706a63c.png)

何かキーを押下すると、プログラムは終了します。

これでC++BuilderでOpenCV 3.2 が利用可能になります。

# 64ビットへの対応

64ビットプロジェクトへの対応を次回説明します。
現在、ある程度は利用できるところまで来ているので、
安定して利用できるようになったら、
64ビット編を作成します。

以上