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を指定した.
場所の指定が終わったら,Configureを選択.
するとまずは真っ赤になって色々出てくる
この赤い色が消えるまでConfigure.
(TeX環境が整ってない場合はBUILD_DOCSのチェックボックスをオフにしておくと良いらしい.)
赤い色がすべて消えたらGenerate
これでCMakeの出番は終わり.
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の下部に変なボタンが幾つか現れる.
この中のCMakeを選択し,Cacheを選ぶとCMakeで設定されているパスとかが表示されるので,その中から
を探し,ここの値にMinGWでビルドしたパスを入れる.(僕の場合は画像の通り)
あとは,左側の保存マークを押して完了*1
おそらくこれでちゃんと使える様になるはず.
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; }
実行画面
ちゃんと動いた.
エラーコード0xC0000135で落ちる
CLionつかってると,たまにエラーコード0xC0000135とかいうのが出て実行ができない事がある.
そういう場合はとりあえずCLionを終了して,管理者として実行してみると割りと上手く行く事がわかったのでおすすめ.