OpenNH

日常のひとこま(自分用のメモとかあれこれ)

OpenCVでchArUcoマーカー/コーナー検出

使用する関数の説明

  • cv::aruco::detectMarkers(...) : マーカー検出関数

<引数>

  1. 入力画像
  2. 検索するマーカーの種類
  3. 検出されたマーカーコーナーのベクトル(Nx4配列)
  4. 検出されたマーカーIDのベクトル(int Nx1配列)
  5. マーカー検出パラメータ

>>OpenCV: ArUco Marker Detection

  • cv::aruco::PREDEFINED_DICTIONARY_NAME : マーカー種類のインデックス

>>OpenCV: ArUco Marker Detection

  • cv::aruco::drawDetectedMarkers(...) : 検出マーカー描画関数

<引数>

  1. 入出力画像
  2. 検索するマーカーの種類
  3. 検出されたマーカーコーナーのベクトル(Nx4配列)
  4. 検出されたマーカーIDのベクトル(int Nx1配列)

>>OpenCV: ArUco Marker Detection

  • cv::aruco::CharucoBoard::create(...) : ChArUcoボードオブジェクトの生成

<引数>

  1. X方向のパターン数
  2. Y方向のパターン数
  3. パターン1個の物理サイズ [m]
  4. マーカー1個の物理サイズ [m]
  5. マーカー種類のディクショナリ

>>OpenCV: cv::aruco::CharucoBoard Class Reference



C++サンプルプログラム(単純な検出&描画)

#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/aruco/charuco.hpp>

#ifndef _DEBUG
// Releaseモードのみで動作
#pragma comment(lib,"opencv_calib3d330.lib")
#pragma comment(lib,"opencv_core330.lib")
#pragma comment(lib,"opencv_highgui330.lib")
#pragma comment(lib,"opencv_imgproc330.lib")
#pragma comment(lib,"opencv_imgcodecs330.lib")
#pragma comment(lib,"opencv_aruco330.lib")
#endif

int readImage(cv::Mat &mat_image, char *dire);

int main() {
	// Read ChArUco stereo images
	cv::Mat img, dstimg;
	readImage(img, "< yourpath >");

	// Create dictionary
	const cv::aruco::PREDEFINED_DICTIONARY_NAME  dictionary_name = cv::aruco::DICT_6X6_250;
	cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(dictionary_name);

	// Detect markers
	std::vector<int> markerIdx;
	std::vector<std::vector<cv::Point2f>> markerCorners, rejectedImgPoints;
	cv::Ptr<cv::aruco::DetectorParameters> detectorParams = cv::aruco::DetectorParameters::create();
	cv::aruco::detectMarkers(img, dictionary, markerCorners, markerIdx, detectorParams, rejectedImgPoints);
        
       	// create charuco board object
	const int   squaresX     = 8;
	const int   squaresY     = 11;
	const float squareLength = 0.031;
	const float markerLength = 0.0185;
	cv::Ptr<cv::aruco::CharucoBoard> charucoboard_obj =
	     cv::aruco::CharucoBoard::create(squaresX, squaresY, squareLength, markerLength, dictionary);
	cv::Ptr<cv::aruco::Board> charucoboard = charucoboard_obj.staticCast<cv::aruco::Board>();

        // refind strategy to detect more markers
	cv::aruco::refineDetectedMarkers(img, charucoboard, markerCorners, markerIdx, rejectedImgPoints);

	// Draw detected markers
	cv::cvtColor(img.clone(), dstimg, cv::COLOR_GRAY2BGR);
	cv::aruco::drawDetectedMarkers(dstimg, markerCorners, markerIdx);
	cv::imshow("Detected result", dstimg);
	cv::waitKey(0);

	return -1;
}

int readImage(cv::Mat &mat_image, char *dire)
{
	// read stereo images in as grayscale (CV_8U):
	mat_image= cv::imread(dire, 0);
	if (mat_image.empty()) {
		printf("ERROR! failed to read one or both images, exiting...\n");
		return 0;
	}
	return 1;
}

マーカー検出結果

f:id:FounderLeis:20181202171230p:plain

 
 

C++サンプルプログラム(ChArUcoボードのコーナー検出)

        // refind strategy to detect more markers
        ...

	// Interpolate charuco corners
	// if at least one marker detected
	std::vector<cv::Point2f> charucoCorners;
	std::vector<int> charucoIdx;
	if (markerIdx.size() > 0) {
		cv::aruco::interpolateCornersCharuco(
			markerCorners, markerIdx, img, charucoboard_obj, charucoCorners, charucoIdx);
	}
        
        // Draw detected corners
        ...
        if (charucoIdx.size() > 0) 
		cv::aruco::drawDetectedCornersCharuco(dstimg, charucoCorners, charucoIdx, cv::Scalar(0, 0, 255));
        ...

コーナー検出結果

f:id:FounderLeis:20181202171327p:plain
 


説明文の折り畳み方法に関してはこちらの記事を参考にさせていただきました。
はてなブログでソースコードを折りたたむ方法 - おもちゃラボ

 
Amazon: 

詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識

詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識

似たような感じの英単語まとめ

個人的に気になった、似てるけど違う用法の英単語や似たような意味の英単語をメモしたものです。メモ書き程度ですが誰かの参考になればと思います。

inversely と conversely の違い

"inversely"と”conversely”どちらも「逆に」という逆接を意味する言葉ですが、使い分けがあるようです。

inversely 一般的に数学用語で用いられる

ex.) inversely proportional : 反比例

conversely 一般的な文章や会話で用いられる

ex.) Our professor said we could take a final exam, or conversely, write a 30-page term paper.

incident と coincident の違い

"incident"と"coincident"は「生じる」ことを意味する言葉ですが、どう違うのでしょうか。

incident 一つのイベントが生じるとき

ex.) Nobody was looking at that incident.

coincident 2つ以上のイベントが同時に生じるとき
(co- : 複数であることを表す接頭語)

ex.) His death was coincident with his son's birth.

hence, therefore, thus, so の違い

hence …だから~(と予想されるだろう)のときに用いられる
therefore …だから~(ならざるを得ないだろう・そうなるのは当然)のときに用いられる
thus ...だから(その結果として)~のときに用いられる


参考:
so, hence, therefore, thusの違い 英語力を上げるには? Vol.6 英会話のマスターはライティングから|神戸 オーパス英語学院
 
 

famous と renowned の違い

"famous"も"renowned"もともに「有名な」ことを意味する言葉ですが、どう違うのでしょう。

famous 一般的によく使われる言葉でとくに用途の決まりは特にない。しいて言えば、良い意味で広く知られているときに使われる言葉です。

ex.) That festival is famous, isn't it ?

renowned 多くの人に知れていて、良い意味を持つときに用いられる。

ex.) He was highly renowned throughout the world as a great pianist.

他にも「有名な」の意味で、以下のような言葉があります。

well-known よく知られた
celebrated 名高い
notorious 評判の良くない
infamous 悪名高い
noted 注目をひいている

 
参考:
famous / well-known / renowned / celebrated / etc... の違い | ER Synonym Dictionary Online
 
 

intriguing と interesting の違い

"intriguing"と"interesting"はどちらも「面白い」の意味を持つ言葉ですが、どう違うのでしょうか。まあ、ほとんど同じ意味で使われるそうですが、強いて言えば以下のような違いがあるそうです。

intriguing もっと深く知りたいと思うような興味をそそられるときに用いられる。

ex.) Your words are intriguing and helpful.

interesting 面白いと思うが、そこまでもっと知りたいと思わないときに用いられる。

ex.) This book is really interesting.

参考:
interesting と intriguing はどう違いますか? | HiNative
 
 

put on, wear, dress の違い

"put on"、"wear"、"dress"はどれも「身に着ける」意味を持つ言葉ですが、それぞれ異なる状況で用いられます。

put on 身に着ける動作を表すときに用いられる

ex.) I put on a jacket this morning.

wear 身に着けている状態を表すときに用いられる

ex.) I'm wearing a jacket now.

dress (誰かに)服を着せるというときに用いられる

ex.) She was dressing her child.
ex.) He can't dress himself.

参考:
「服を着る」のput on / wear / dressの違い | ネイティブと英語について話したこと
 
 

outfit, clothes, clothing, attire の違い

"outfit"、"clothes"、"clothing"、"attire"はいずれも「衣服」を意味する言葉ですが、どのように違うのでしょうか。

outfit 一般的にコーディネート全体を含めた衣服を指すときに用いられる
clothes 身に着けるものであればなんでも表される
clothing clothesと同様
attire フォーマルな衣装の時に用いられる
ex.) business attire, sports attire, formal attire ...


参考:
outfit と clothes と clothing と attire と apparel はどう違いますか? | HiNative

acronym と abbreviation の違い

"acronym"と"abbreviation"はどちらもLOLやJPYといった「省略語」のことを言いますが、ちゃんと使い分けがあります。ちなみに、acronymは発音するとき"r"を発音せずにカタカナで書くと「アクニム」と言いますね。

acronym 頭文字をとった略語に用いられる

ex.) LOL = laugh out loud (日本でいう'(笑)'や'www'と一緒の意味)

abbreviation とにかく省略された言葉全てに用いられる
(数学的に、abbreviation ⊃ acronym )

ex.) JPY= Japan yen

参考:
略語 : abbreviation と acronym - 職業プログラマの休日出勤
学校では教えてくれないacronymランキング | "学者への道" in California Berkeley


英語問題を載せているサイトのリンク

  • 英訳問題集(詳しい解説付き)

 >><英訳:問題一覧>

Gitの使い方メモ

はじめに

Gitを使い始めるにあたりこちらの書籍がわかりやすく参考になりました。
その他のことも暇なときに追加していきたいと思います(メモ程度ですが)。

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

 

環境

OS : windows10 64bit
Git ver. : 2.18.0
Tool : SourceTree ver.3.0.8


git init:リモートリポジトリの作成

まず、Git Bashを起動します。以降の作業は基本的にすべてGit Bash上で行います。
[ Git Bashがなんなのかを知りたい方はこちら ↓↓]

 
*コマンドシェルでの注意点
以下のように'\'ではなく'/'を使って下さい。

x:mkdir \c\Users\"Username"\OneDrive\GitSpace
o:mkdir /C/Users/"Username"/OneDrive/GitSpace

 
利用したいサーバにリモート・リポジトリを作成するために任意のディレクトリを作成します。

// 例:OneDriveのGitSpaceディレクトリに作成する場合
$ mkdir  /C/Users/<Username>/OneDrive/GitSpace
$ mkdir  /C/Users/<Username>/OneDrive/GitSpace/sample.git

 
共有設定したディレクトリに移動し、オプションを指定して”git init”コマンド実行します。

$ cd  /C/Users/<Username>/OneDrive/GitSpace/sample.git
$ git init --bare --shared
Initialized empty shared Git repository in C:/Users/<Username>/OneDrive/GitSpace/sample.git/

これで共有リポジトリが作成されました。
 
次にローカルのリポジトリに移動して,作成したリポジトリを"origin"という名前のリモート・リポジトリとして追加します。今回はデフォルト設定の"origin"という名前にしましたが、任意に変更してください。

// 例:ローカルリポジトリを”/C/<yourpath>/Gitwork”とする場合
$ cd  /C/<yourpath>/Gitwork
$ git remote add origin /C/Users/<Username>/OneDrive/GitSpace/sample.git
$ git remote -v
origin C:/Users/<Username>/OneDrive/GitSpace/sample.git (fetch)
origin C:/Users/<Username>/OneDrive/GitSpace/sample.git (push)

git remote にオプション"–v"指定して実行し、originに対する書き込み(push)と読み取り(fetch)コマンドが表示されれば、リモート・リポジトリが正しく作成されています。
 
 
こちらのサイトが非常に参考になったのでリンクを貼っておきます。
参考サイト:
【Git入門】git initによるリモートリポジトリの作成方法
WindowsでGitを始めたらまず確認!Git Bashの設定&ショートカット | 株式会社グランフェアズ 
 
 

git mv:ファイル名の変更

$ git mv sample.html sample_remane.html


touch:新規ファイルの作成

$ touch sample.txt

 
 
 

グレイコードパターンを投影する

はじめに

最近グレーコードパターンを利用したカメラの歪み補正を行うことになり、グレイコードパターンをディスプレイに投影する必要が出てきたので、そのメモを残しておきます。
 

グレイコードとは

グレイコード(Gray Code)とは、隣り合うビット変化が1ビットしかないようにした2進数表現のことです。
具体的にはこのようになります。

10進数 バイナリコード グレイコード
0 0000 0000
1 0001 0001
2 0010 0011
3 0011 0010
4 0100 0110
5 0101 0111
6 0110 0101
7 0111 0100
8 1000 1100
9 1001 1101
10 1010 1111
11 1011 1110
12 1100 1010
13 1101 1011
14 1110 1001
15 1111 1000

 

なぜカメラの歪み補正にグレイコードを利用するのか

グレイコードでは上述したように、隣接値のハミング距離が1つとなるので、白黒画像の境界上での符号化誤りを最小化できるためです。カメラの歪み補正のためにはディスプレイ座標の縦軸と横軸にそれぞれ平行な2通りのグレイコードパターンを用いることになります。
なお、バイナリコードを用いてパターン光を構成することもできますが、バイナリコードでは隣接値でビットが反転することがあり、1ビットの誤りで値が大きく変わってしまい符号化誤りの影響を大きく受けてしまいます。
 
例えば、バイナリコードで「0100」の場合を考えてみましょう。

10進数
バイナリコード 0100 4
グレイコード 0110 4

となりますが、もし上記の隣接値がビット反転したらどうなるでしょうか?

10進数
バイナリコード 0000 0
グレイコード 0010 3

このように、バイナリコードでは10進数において4のずれが生じてしまします。一方で、グレイコードでは1のずれしかなく隣接値のビット反転の影響を受けにくいことが分かります。
 

OpenCVを用いたグレイコードパターンの投影

拡張モジュールopencv_contibのビルド

ソースのダウンロード

以下のリンクから拡張モジュールとOpenCVのソースをダウンロードできます。

  • 拡張モジュールopencv_contibのソース

https://github.com/opencv/opencv_contrib/releases

https://opencv.org/releases.html

<注意点>
・拡張モジュールのバージョンとOpenCVのバージョンは一致させる必要があります。
・拡張モジュールのビルドに本体であるOpenCVのソースが必要となります。
 

Cmake

CMakeのGUIで下記のテキストボックスに記載した値を入力します。

  • Where is the source code

>> c:\”your path”\oopencv-x.x.x を指定

  • Where to build the binaries

>> c:\”your path”\oopencv-x.x.x\build を指定

一度Configureをクリックし赤い画面で設定項目がいろいろ出てくると思うので以下の部分を設定します。

>> c:/”your path”/opencv_contrib-x.x.x/modulesを設定

<注意点>
"\"ではなく”/”でパスを指定することです。
 
次にもう一度Configureをクリックし、エラーが出なければGenerateをクリックしソリューションファイルを生成します。
"c:\”your path”\oopencv-x.x.x\build”にOpenCV.slnというソリューションファイルが作れらているはずなので、起動しCMakeTargets\INSTALLをスタートアッププロジェクトに指定してビルドします。
もしくはバッチビルドで指定してからビルドします。

そうすれば、bin・lib・includeディレクトリに拡張モジュールのライブラリが追加されているはずです。
 
 
 
サンプルプログラムなどの続きは後々書きます。
 
 

参考にしたサイト:
taktak.jp
tecsingularity.com
https://kamino.hatenablog.com/entry/opencv-graycode
https://kamino.hatenablog.com/entry/opencv_contrib_install

 
 
 

MATLABのbar3でxy座標値を任意に変更する

はじめに

MATLABで3次元の棒グラフを使用したい機会があり、使用したのですがなかなか使いづらい関数でした…。
デフォルトのままではxyの座標値がなぜか設定できない。

例えば、このようなコードではxyの値がデータ数になってしまいます。

[X, Y] = meshgrid(10:20, -10:10);
Z = sqrt(X.^2+Y.^2);
figure;
bar3(Z);
xlabel('X');
ylabel('Y');
zlabel('Z');

↓↓こんな感じになってしまいます。
f:id:FounderLeis:20181119002140p:plain

”bar3()”に関する公式解説
jp.mathworks.com
 
このxy座標をデータ数ではなく数値にしたいのですが、ググってみてもなかなかいい方法がないようでした。

なので、bar3のxy座標値を任意に設定できる関数を作成してみました。

ソースコード

function [] = bar3XYtick(ax, X, Y, T)
%BAR3XYTICK bar3のX,Y座標の値を設定
%  BAR3XYTICK(B,X,Y)
%  Input
%  ax : Handle of figure's Axis 
%       変更したい図の座標軸
%  X  : X coordinate values (vector)
%       X座標値(ベクトル)
%  Y  : Y coordinate values (vector)
%       Y座標値(ベクトル)
%  T  : (tx, ty) Number of thin out
%       座標メモリ表示における間引く数 
%        tx : X座標の刻み
%        ty : Y座標の刻み
%
%  @ Fumihachi - 2018/11/19
%

minX = min(min(X));
minY = min(min(Y));
maxX = max(max(X));
maxY = max(max(Y));
if isvector(X)
    Nx   = length(X);
    Ny   = length(Y);
else
    Nx   = length(X(1,:));
    Ny   = length(Y(:,1));
end
dx = (maxX-minX)/(Nx-1);
dy = (maxY-minY)/(Ny-1);

set(ax, 'XTick', 1:T(1)/dx:Nx);
set(ax, 'YTick', 1:T(2)/dy:Ny);
set(ax, 'XTickLabel', minX:T(1):maxX);
set(ax, 'YTickLabel', minY:T(2):maxY);
axis([0 Nx+1 0 Ny+1]);
view([-37.5 30]);
end


サンプルコード(使い方)

clear; close all; clc;

% Exsample 1
[X, Y] = meshgrid(-10:10, -10:10);
Z = sqrt(X.^2+Y.^2);
figure;
bar3(Z);
bar3XYtick(gca, X, Y, [2 5]);
xlabel('X');
ylabel('Y');
zlabel('Z');

% Exsample 2
X = -pi:0.1:pi;
Y = -pi:0.1:pi;
Z = sin(X')*sin(Y);
figure;
bar3(Z);
bar3XYtick(gca,X, Y, [2 2]);
xlabel('X');
ylabel('Y');
zlabel('Z');


実行するとこんな感じの図が表示されます。
Exsample1:
f:id:FounderLeis:20181119003439p:plain
Exsample2:
f:id:FounderLeis:20181119002929p:plain

ちゃんとデータ数ではなく数値が入っていることが確認できます。

―――――――――――――――――――――――――――――――
もっときれいにやる方法がある気がするが思い浮かばないですね…
どなたかもっと簡潔にできる方法を知っている方がいたら教えていただきたです。
 
 

Windows10でアプリ表示がぼやけてしまう場合の対処

 

ノートパソコンを新しくしてMATLAB R2017aを起動したことろ、以下のように画面がぼやけて表示されてしまう現象にあいました。

この現象が現れるのは、外部ディスプレイに接続して表示した場合のみで、組み込みディスプレイではちゃんときれいに表示されています。

f:id:FounderLeis:20181107141728p:plain

 

原因はなんなのか…高画素ディスプレイを使用しているためにアプリが対応していなくで微妙に拡大表示されているのかな、とも考えながらググっていたらいい記事を発見したので転載しておきます

www.itmedia.co.jp

 

解決方法

アプリの実行ファイルのショートカットの"プロパティ"から、

互換性 > 高DPI設定の変更 >

 ・"プログラムDPIにチェック"  

 ・"DPIの使用をプログラムを開いたときに変更"

を設定すれば完了です。

f:id:FounderLeis:20181107142538p:plain

f:id:FounderLeis:20181107142719p:plain

f:id:FounderLeis:20181107142251p:plain

 

これで、きれいに表示されるようになりました。

f:id:FounderLeis:20181107143129p:plain

 

よかったです。

 

 

 

 

OpenCV3.4.3の環境構築【Windows10】

はじめに

Windows環境かつVisual Studioで、OpenCVを利用したアプリケーション開発を行いたい人向けの環境構築方法について載せておきます。なお、OpenCV3.4.3をCmakeを用いてビルドする方法を紹介します。動作確認としてVisual Studio 2015を利用します。

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)

環境

Windows10 Pro
Visual Studio 2015
OpenCV3.4.3
CMake3.13.0

CMakeのインストール

現行で最新のcmake-3.13.0のwindows版を公式サイトからダウンロードします。今回はzipファイルを選択します。
↓ダウンロードリンク(zipファイルがダウンロードされます)
https://cmake.org/files/v3.13/cmake-3.13.0-rc2-win64-x64.zip

f:id:FounderLeis:20181104092609p:plain:w514

zipファイルをインストールしたら任意のフォルダに展開(解凍)してください。私の環境では2,3分かかりました。

f:id:FounderLeis:20181104093645p:plain:w216

このようなフォルダとなっているはずです。

「~\bin\cmake-gui.exe」でもうCMakeを使うことができます。

f:id:FounderLeis:20181104093934p:plain:w135

 cmake-gui.exeを実行すると以下のようなGUIが表示されれば正常にインストール完了です。

f:id:FounderLeis:20181104094633p:plain:w490
 

もし以下のような注意が表示された場合は、「詳細情報」から「実行」を選択してください。
f:id:FounderLeis:20181104094404p:plain:w300
f:id:FounderLeis:20181104094459p:plain:w300

コマンドプロンプトから実行したい場合

コマンドプロンプトからCMakeを実行したい場合には、環境変数に以下のパスを追加してください。

環境変数  環境値
Path C\:<保存先>\CMake\bin 

 コマンドプロンプトで、"cmake --version"コマンドを実行して以下のようなメッセージが表示されていればCMakeの環境変数設定が正しく行われています。
f:id:FounderLeis:20181104102908p:plain:w460


CMakeのインストールはこれで終わりです。それでは、OpenCVをインストールしていきましょう。

 

OpenCVのインストール

現行でOpenCV3シリーズ最新の”OpenCV3.4.3”のwindows版を公式配布サイトからダウンロードします。今回はCMakeでビルドするので「Sources」を選択します。

↓ダウンロードリンク(zipファイルがダウンロードされます)
https://github.com/opencv/opencv/archive/3.4.3.zip

f:id:FounderLeis:20181104095105p:plain:w380

zipファイルをインストールしたら任意のフォルダに展開(解凍)してください。私の環境では3分くらいかかりました。

f:id:FounderLeis:20181104100818p:plain:w210

このようなフォルダ構成となっているはずです。

  
それではCmakeでビルドしていきます。
Cmake-GUIを起動して、以下の操作をしてください。

  1. ソースコード場所には、さっき解凍した先のルートディレクトリ「C:\<保存先>\opencv-3.4.3」を、ビルド先(ソリューションファイルの生成先)には,「C:\<保存先>\opencv-3.4.3\build」をそれぞれ指定
  2. 「Configure」をクリック
  3. 今回はVisual Studio 2015の環境なので、コンパイラは「Visual Studio 14 2015 Win64」を指定

f:id:FounderLeis:20181104103803p:plain:w415

 そうすると、
下図のように設定可能なパラメータが赤く表示されます。任意で設定項目を変更してください。特に設定をしない場合は、そのままで結構です。
CUDAの設定を行いたい方は、次節を読んでください。

f:id:FounderLeis:20181104105030p:plain:w400

設定をカスタマイズした後に「Configure」をクリックし、最後に「Generate」をクリックことで、ソリューションファイルを生成できます。

 

CUDAの設定を行う

使用するパソコンにCUDAがインストールされており、OpenCVのCUDA機能を使いたい人のみ以下の設定を行ってください。なお、この設定を行うとビルド時間がとても長くなります。
(以前に他のPCでセットアップした時の設定なのでVersionが異なります)

f:id:FounderLeis:20181104110735p:plain:w400

↓↓ GPUアーキテクチャ番号の確認
https://developer.nvidia.com/cuda-gpus

 f:id:FounderLeis:20181104111003p:plain:w400

OpevCVでCUDAを利用する場合の設定は以上です。

 

以下はCUDAを利用しない人も共通です。

OpenCVのビルド

 ソリューションファイルの生成先に指定した「C:\<保存先>\opencv-3.4.3\build」直下にある「OpenCV.sln」をVisual Studioで開きます。

  1. バッチビルドから”ALL_BUILD”のDebugとReleaseをチェックします。
  2. チェックしたら”ビルド”します。
  3. ビルドが終了し「C:/<保存先>/opencv-3.4.3/build/install」にinclude、libおよびbinが正しく保存されていれば完了です。

f:id:FounderLeis:20181104112001p:plain
 

環境パスの設定

プログラムを作成するたびにOpenCVのdllファイルをコピーしてくるのは面倒なので、環境パスに設定しましょう。環境変数"Path"にOpenCVのdllファイルが存在するフォルダのパスを追加してください。

 環境変数 環境値
Path C:\<保存先>\opencv-3.4.3\build\install\x64\vc14\bin  

これで、いちいち面倒な作業がなくなります。

 

サンプルプログラム

黒背景に緑色の「OpenCV」の文字を描画した画像を生成するだけのプログラムになります。実行すると以下のような画像が表示されます。
f:id:FounderLeis:20181104204555p:plain:w250

ソースコード

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

// OpecCVのライブラリの読み込み
#ifdef _DEBUG
#pragma comment(lib,"opencv_core343d.lib")
#pragma comment(lib,"opencv_highgui343d.lib")
#pragma comment(lib,"opencv_imgproc343d.lib")
#else
#pragma comment(lib,"opencv_core343.lib")
#pragma comment(lib,"opencv_highgui343.lib")
#pragma comment(lib,"opencv_imgproc343.lib")
#endif

int main()
{
// 幅320px-高さ240pxの画像を生成
cv::Mat img(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 0));

// 画像に「OpenCV」の文字列を描画
cv::Mat dst = img.clone();
cv::putText(dst, "OpenCV", cv::Point(80, 100), cv::FONT_HERSHEY_SIMPLEX, 1.2, cv::Scalar(0, 200, 0), 2, CV_AA);

// 描画
cv::imshow("dst image", dst);
cv::waitKey(10000);

return -1;
}


注意点

プロジェクトのプロパティでOpenCVのインクルードディレクトリとライブラリディレクトリを指定してから実行してください。
f:id:FounderLeis:20181104212053p:plain:w350