電気ひつじ牧場

技術メモ

【C++】OpenCV3をOSXにインストールしてcmakeで優勝💪💪【完全に理解した】

当社調べによりOpenCVはインストール方法が25万通りあることが判明しています。プラットフォームや使う言語によっても様々でわけわからなくなったので今後のためにメモっておきます。


とにかく「やるか」と思った時に手を出すのが肝心で、環境構築が面倒だったり時間がかかるとそれだけで萎えてしまいます。(環境構築が楽しいという意見もありますが・・・)
言語はC++、OSはOSXを使うことを想定しています。Pythonを使ってやるのが簡単で良いよという話を聞くのですが、結局それらはC++のラッパーなのでどのみちC++を理解していないと辛い部分があるようです。

インストールはbrewでやる

ソースからビルドした方がカスタマイズできて良いらしいですが依存モジュールがどうこうとかで大変そうなのでbrewでやります。

$ brew install opencv

cmakeをインストール

プログラムを書くたびにg++でオプションを設定するのは流石にめんどくさいのでビルドツールを使います。cmakeがインストールされていない場合はbrewでインストール。

$ brew install cmake

テストプログラムの作成

main.cpp
#include <opencv2/opencv.hpp>
int main() {
    cv::Mat img = cv::imread("../sample/test.png", -1);
    if(img.empty()) {
        return -1;
    }
    cv::namedWindow("ex", cv::WINDOW_AUTOSIZE);
    cv::imshow("ex", img);
    cv::waitKey(0);
    cv::destroyWindow("ex");
    return 0;
}

「詳解 OpenCV3(オライリージャパン)」のサンプルコードをほぼまんまコピペしました。../sample/test.pngをキーを押すまで表示するプログラムです。

CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
project (test)  //プロジェクト名
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") //コンパイルオプション
find_package(OpenCV REQUIRED)  
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBS})

find_package(OpenCV REQUIRED)の部分で先ほどbrewでインストールした/usr/local/share/OpenCVを検索しています。検索にはルールがあるようですがこの記事が詳しいです。
find_packageの動作

/usr/local/share/OpenCV/の中には ${OpenCV_INCLUDE_DIRS}や${OpenCV_LIBS}が定義されているファイルがあり、それを元にリンクなどが行われます。最終行のtarget_link_libraries(main ${OpenCV_LIBS})では使われないライブラリまでリンクしてしまい、あまり良くないのですが最初なので良いことにします。

ビルド

build/を作成しその中に移動しておきます。プロジェクト全体のディレクトリ階層はこんな感じ

.
├── CMakeLists.txt
├── build
├── main.cpp
└── sample
    └── test.png
$ cd build
$ cmake ..
$ make
$ ./main

画像が表示されました。やったね。