コンテンツにスキップ

Top

Visual Studio 2019 の VC++ で OpenCV 4.2.0 を使うための設定

Visual Studio 2019 の VC++ で OpenCV 4.2.0 を使えるようにする方法について述べる

OpenCV 4.2.0のダウンロード

公式HP上からダウンロードする
https://opencv.org/releases/

opencv-4.2.0-vc14_vc15.exeをダブルクリックして任意のディレクトリに展開する。
ここではC:\に展開し、C:\opencvディレクトリができたものとする。
そのままでも問題ないが、他のバージョンのOpenCVを使う場合も今後出てくると思うので、C:\opencv4.2.0とか名前を変えておく。

OpenCVのダウンロードが遅い、停まる、困る!

OpenCVをダウンロードしようとして困るのが激遅なこと。
遅いだけならまだしも、途中で止まったりしやがる。
普通ならmirrorに逃げたいところだが、見当たらない。どうしたものか?と思っていたらgithubでも公開してたのでこちらからダウンロードする手順ものせる。

こっちからのダウンロードは別に速くはないが途中で止まったりはしなかった!
https://github.com/opencv/opencv/releases

もしも上記でダウンロードできずに困っている方はgithubのほうからのダウンロードを試してみては?

プロジェクトの作成とOpenCVの設定

OpenCVをVisualStudioで使う場合、プロジェクトを作成するたびに毎回毎回設定しないといけない。
しかも、DebugとReleaseの両方それぞれ設定しないといけない。
(ライブラリが違ったりもするので丸コピーというわけでもない) 面倒臭い。。。なんか簡単な方法があればいいのだが。

プロジェクトの作成

任意のプロジェクトを適当に作成する。ここではコンソールアプリで、名前をopencv_sampleとして作成したものとする。

OpenCVを使えるようにするための設定

まずはDebugから。

  1. プロジェクト→opencv_sampleのプロパティを開く(opencv_sampleはプロジェクト名)

  2. 構成:Debug、プラットフォーム:x64にする(今時x64じゃないとは思えないけどそうじゃなかったらwin32とか適宜勝手に)

  3. 構成プロパティ→デバッグ→環境に PATH=C:\opencv4.2.0\build\x64\vc15\bin;%PATH% を設定する(PATHは自分の環境に合わせること)

  4. 構成プロパティ→VC++ディレクトリ→インクルードディレクトリに C:\opencv4.2.0\build\include; を先頭に追加する(セミコロン忘れないこと)

  5. 構成プロパティ→VC++ディレクトリ→ライブラリディレクトリに C:\opencv4.2.0\build\x64\vc15\lib; を先頭に追加する(セミコロン忘れないこと)

  6. 構成プロパティ→リンカー→入力→追加の依存ファイルに opencv_world420d.lib; を先頭に追加する(リリースモードの時はopencv_world420.lib。よく間違えるので注意!)

Releaseも同様に。「6.」だけ異なるので要注意!

テンプレートマッチング(パターンマッチング)のアプリを実装

OpenCVの公式サイトにあるTemplateMatchingのサンプルを動かしてみる。

An example using Template Matching algorithm
https://docs.opencv.org/4.2.0/d8/ded/samples_2cpp_2tutorial_code_2Histograms_Matching_2MatchTemplate_Demo_8cpp-example.html

なお、messi5.jpgはC:\opencv\sources\samples\data\の中に存在するが、

messi_face.jpg

は存在していないので、https://docs.opencv.org/master/d4/dc6/tutorial_py_template_matching.html あたりから右クリックでダウンロードするか、自分で切り取って作成する。

ソースコード

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;
bool use_mask;
Mat img; Mat templ; Mat mask; Mat result;
const char* image_window = "Source Image";
const char* result_window = "Result window";
int match_method;
int max_Trackbar = 5;
void MatchingMethod(int, void*);

void MatchingMethod(int, void*)
{
    Mat img_display;
    img.copyTo(img_display);
    int result_cols = img.cols - templ.cols + 1;
    int result_rows = img.rows - templ.rows + 1;
    result.create(result_rows, result_cols, CV_32FC1);
    bool method_accepts_mask = (TM_SQDIFF == match_method || match_method == TM_CCORR_NORMED);
    if (use_mask && method_accepts_mask)
    {
        matchTemplate(img, templ, result, match_method, mask);
    }
    else
    {
        matchTemplate(img, templ, result, match_method);
    }
    normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
    double minVal; double maxVal; Point minLoc; Point maxLoc;
    Point matchLoc;
    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
    if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)
    {
        matchLoc = minLoc;
    }
    else
    {
        matchLoc = maxLoc;
    }
    rectangle(img_display, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(255), 2, 8, 0);
    rectangle(result, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(255), 2, 8, 0);
    imshow(image_window, img_display);
    imshow(result_window, result);
    return;
}

int main(int argc, char** argv)
{
    img = imread("C:\\opencv4.2.0\\sources\\samples\\data\\messi5.jpg", IMREAD_COLOR);
    templ = imread("C:\\opencv4.2.0\\sources\\samples\\data\\messi_face.jpg", IMREAD_COLOR);
    if (img.empty() || templ.empty() || (use_mask && mask.empty()))
    {
        cout << "Can't read one of the images" << endl;
        return EXIT_FAILURE;
    }
    namedWindow(image_window, WINDOW_AUTOSIZE);
    namedWindow(result_window, WINDOW_AUTOSIZE);
    const char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
    createTrackbar(trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod);
    MatchingMethod(0, 0);
    waitKey(0);
    return EXIT_SUCCESS;
}

実行結果

実行結果

理由が良くわからないが、createTrackbarあたりがあんまりうまくいっていない。左右バーの移動や文字とかいろいろおかしい。が、OpenCVとは関係ないのでいいや。

あれれ?コンパイルエラーになるぞ?

ちゃんと設定したはずなのに、

E1696   ソース ファイルを開けません "opencv2/opencv.hpp"

とか出てコンパイルできないぞ!

というかた。x86になってませんか?もしx86になっていたら、x64に直しましょう。

コマンドプロンプト上から実行するとdllが見つかりませんエラー

コンパイルしてできたexeファイルを直接クリックしたり、コマンドプロンプト上から実行しようとしたら、

というエラーが出てしまったあなた。

これは環境変数が設定されていないせい。

コントロールパネル→システムとセキュリティ→システム→システムの詳細設定を選択するとシステムのプロパティが表示されるので、そこの詳細設定タブから環境変数に入り、環境変数を設定する。

ユーザーの環境変数→Pathに

C:\opencv4.2.0\build\x64\vc15\bin
(当然、パスは自身の環境に合わせて変更すること)

を追加する。libじゃなくてbinなことに注意すること!

以上