ロボットと趣味と自堕落と

ロボットの事なんか一言も書いてない

MinGWでOpenCVをビルドしてCLionで使った話

CLionでOpenCVも使えるようにしたいので,MinGWでビルドした話とかをする.
なお,環境は下記

  • Windows10(64bit), Windows7(64bit)
  • OpenCV2.4.11
  • CLion1.2.1

MinGWとCMakeは既にインストールされてるものとする.

OpenCVをビルドする

必要なものは

OpenCVをダウンロードしてくる

公式サイトからダウンロードするsourceforge.net
好きな場所に展開する(僕はD:\OpenCVに展開)

CMakeでgenerate

CMake GUIを開いて"Where is source code"にソースの場所を入れ,"Where to build the binaries"にビルド出力先を指定する.
Where is souece codeにはopencv\sourceを
Where to build the binariesにはopencv\mingwを指定した.
f:id:i-hako:20151125191500p:plain

場所の指定が終わったら,Configureを選択.
するとまずは真っ赤になって色々出てくる
f:id:i-hako:20151125191337p:plain
この赤い色が消えるまでConfigure.
TeX環境が整ってない場合はBUILD_DOCSのチェックボックスをオフにしておくと良いらしい.)

赤い色がすべて消えたらGenerate
これでCMakeの出番は終わり.

MinGWのヘッダーを書き換える

CMakeでGenerateが終わったら本当はすぐにMinGWでビルドするのだけれど,OSのバージョンによってはmingw32-makeがエラーで途中で止まってしまう事がある.
そこでMinGWのヘッダーの一部を書き換える必要がある.
まずはMinGWがインストールされてる場所まで行き,includeの中の"commctrl.h"を開く
f:id:i-hako:20151125192342p:plain
commctrl.hの中に_WIN32_IEを定義してる場所があるので,そこを下図の様に書き換える
f:id:i-hako:20151125193303p:plain
よくわからないけれど,こうすることでmingw32-makeのエラーを回避できる.

MinGWでビルド

コマンドプロンプトを開いてCMakeでGenerateした場所まで行く.(僕の場合D:/OpenCV/opencv_2-4-11/mingw
続いて下記コマンドを入力

mingw32-make

makeが終わったら続いてinstall

mingw32-make install

こうするとOpenCV/opencv_2-4-11/mingw/install下にインストールされる.
後は環境変数にbinとlibのパスを追加して終了.

CLionでOpenCVを使う

CMakeLists.txtを編集

CLionでプロジェクトを開いたら,CMakeLists.txtを編集して,下記を追加する

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(<project name> ${OpenCV_LIBS})

おそらくこれで本当はちゃんと使えるはずだけれど,僕は上手く行かなかったので上手く行かなかった時のための方法も下記しておく

CMakeLists.txtを編集してもうまく行かなかった場合

CLionとCMakeの連携が取れていないのかも知れないけれど,たまに正しいディレクトリが反映されない事がある.
そういう場合はCLionのGUI上でCMakeListsを編集すると良い.
まず[View]->[Tool Buttons]を選択し,ツールボタンを表示させる.すると,CLionの下部に変なボタンが幾つか現れる.
f:id:i-hako:20151125194743p:plain
この中のCMakeを選択し,Cacheを選ぶとCMakeで設定されているパスとかが表示されるので,その中から

を探し,ここの値にMinGWでビルドしたパスを入れる.(僕の場合は画像の通り)
f:id:i-hako:20151125195511p:plain
あとは,左側の保存マークを押して完了*1
f:id:i-hako:20151125195526p:plain
おそらくこれでちゃんと使える様になるはず.

OpenCVとマウスでお絵かきできるミニアプリを作った

試しにLenna*2さんを表示するのは皆やってるので,とりあえずマウスポインタでお絵かきできる奴を作ってみた.

コード

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

using namespace std;

bool drawing = false;
cv::Point point;

void drawLine(cv::Mat* img, cv::Point points){
    cv::circle(*img, points, 3, cv::Scalar(255,255,255), -1, CV_AA);
}


void onMouse(int event, int x, int y, int flag, void* params){
    cv::Mat* image = static_cast<cv::Mat*>(params);

    switch(event){
        case cv::EVENT_MOUSEMOVE:
            if(drawing){
                point.x = x;
                point.y = y;
            }
            drawLine(image, point);
            break;

        case cv::EVENT_LBUTTONDOWN:
            drawing = true;
            point.x = x;
            point.y = y;
            drawLine(image, point);
            break;

        case cv::EVENT_LBUTTONUP:
            drawing = false;
            break;
    }
}

int main() {
    string name = "canvas";

    cv::Mat black_image = cv::Mat::zeros(cv::Size(800, 600), CV_8UC3);
    cv::Mat temp = black_image.clone();

    cv::namedWindow(name, CV_WINDOW_AUTOSIZE);

    cv::setMouseCallback(name, onMouse, (void *)&black_image);

    while(1){
        black_image.copyTo(temp);

        if(drawing)
            drawLine(&temp, point);

        cv::imshow(name, temp);

        if(cv::waitKey(100) == 27)
            break;
    }

    return 0;
}

実行画面
f:id:i-hako:20151125200649p:plain
ちゃんと動いた.

エラーコード0xC0000135で落ちる

CLionつかってると,たまにエラーコード0xC0000135とかいうのが出て実行ができない事がある.
そういう場合はとりあえずCLionを終了して,管理者として実行してみると割りと上手く行く事がわかったのでおすすめ.

*1:そういえば今だにフロッピーマークなのかと気づいた

*2:レナ (画像データ) - Wikipedia

*3:2015/11/25 21:00追記