Windows Visual StudioでRaspberry pi OpenCVのビルド環境を構築する

Windows Visual StudioでRaspberry pi OpenCVのビルド環境を構築します。
厳密にはクロスコンパイルではなく、Visual StudioがRaspberry Piにログインしてビルドを行います。

前提条件

Raspberry PiにOpenCVのインストールが終了していて、ビルドが通ること。
Raspberry PiにOpenCVのインストールフォルダは/usr/include
Visual Stdioは2019で動作確認
言語はC++です。

Raspberry pi側にSambaを設定する

Raspberry pi側のincludeファイルのフォルダを共有して、Visual Studio側のinclude参照先にすることにより、Intellisence等を有効します。
Raspberry pi側の端末でSambaをインストールします。

$ sudo apt-get install -y samba

共有フォルダを追加するために /etc/samba/smb.conf の末尾に下記の記述を追加します。

[usr]
path = /usr
writable = no
guest ok = yes
guest only = yes

Sambaのサービスを再起動します。

$ sudo service smbd restart

Windows側でエクスプローラからRaspberry piのIPアドレス(\192.168.1.40等)を入力して共有フォルダが出来れいれば成功です。

Windowsの共有フォルダを設定する

Visual Studioにネットワーク先のフォルダ(\\192.168.1.40\include等)を参照させると、Intellisenceは通るが、build時になぜか、「MSB4018 “MakeClCommandLine” タスクが予期せずに失敗しました。」というエラーを吐くので、対策として、共有フォルダをネットーワークドライブに割り当てておきます。
エクスプローラ→ネットワークを右クリック→ネットワークドライブの割り当てでRaspberry側の共有フォルダをネットワークドライブに割り当てておきます。
ここではXドライブに割り当てたものとして、以後説明をしていきます。

Visual Studioのプロジェクトを作成してRaspberry Piと接続する

「Raspberry Piの点滅」というプロジェクトテンプレートで作成します。
プロジェクトテンプレートの検索をRaspberryで検索するとヒットすると思います。
プロジェクトを生成すると案内文のようなガイドがでますので、これを読んでRaspberry Piとの接続設定を行います。
案内文は2回目に開くとなぜか消えていて再度開く方法がわからないので、注意してください。
一度何も手を加えていない状態でビルドして、エラーがなければ、接続や設定は成功しているでしょう。

OpenCVが使えるようにVisual Studioの設定を行う

「ツールバー→プロジェクト→【プロジェクト名】プロパティ」を開きます。
【プロジェクト名】は現在のプロジェクトの名称が入ります。

インクルードディレクトリの設定

「構成プロパティ→VC++ディレクトリ」の「インクルードディレクトリ」に共有ファイルで設定したOpenCVのインクルードディレクトリを設定します。
ここに\192.168.1.40から始まるアドレスを入れると、コンパイル時にエラーになってしまうので、前項の通りネットワークドライブに割り当てた場所を設定します。
ここでは、「X:\include\opencv4」を設定しておきます。
インクルードディレクトリにOpenCVのインクルード場所を設定することにより、ビューワ上でのエラーを解消し、Intellisenceが使用可能になります。

追加のインクルードディレクトリの設定

「構成プロパティ→C/C++→全般」の「追加のインクルードディレクトリ」にRaspberry Pi上でのOpenCVのインクルードディレクトリを設定します。
ここでは、「/usr/include/opencv4」を設定しておきます。
追加のインクルードディレクトリはVisual StudioがRaspberry Pi内でビルドするときのg++コマンドライン-Iに相当するようです。

ライブラリの依存ファイルの設定

「構成プロパティ→リンカー→入力」の「ライブラリの依存ファイル」にOpenCVのライブラリファイルを記載します。
ここでは一通り
opencv_dnn
opencv_gapi
opencv_highgui
opencv_ml
opencv_objdetect
opencv_photo
opencv_stitching
opencv_video
opencv_calib3d
opencv_features2d
opencv_flann
opencv_videoio
opencv_imgcodecs
opencv_imgproc
opencv_core
を設定します。ライブラリファイルは状況に応じて書き換えてください。
ライブラリの依存ファイルはVisual StudioがRaspberry Pi内でビルドするときのg++コマンドライン-l(小文字L)に相当するようです。

ビルドしてみる

Visual Stduio上でmain関数を適当にOpenCV用のコードを書きかえてビルドしてみます。

#include <iostream>	
#include <opencv2/opencv.hpp>	
	
int main(void)	
{	
	cv::Mat m = cv::imread("sample.png", 1);
	cv::namedWindow("sample", cv::WINDOW_AUTOSIZE);
	cv::imshow("sample", m);
	cv::waitKey(0);
	cv::destroyAllWindows();
	
	return 0;
}	

「ツールバー→ビルド→ソリューションのビルド」を実行してエラーがなければRaspberry Pi上にビルド結果が保存されます。
ビルドしたプロジェクトはデフォルトでRaspberry Pi上の/home/pi/projects/【プロジェクト名】にあります。
さらに実行ファイルは/home/pi/projects/【プロジェクト名】/bin/ARM/Debugにありますので、sample.pngを同ディレクトリに配置して、画像が表示されれば成功です。

作成:松林雄一