Mac環境でOpenCVをmakefileを使ってコンパイルする方法


背景

Windows環境でOpenCVのスクリプトを書いていた時は、VisualStudioだったので設定でincludeフォルダとlibフォルダのそれぞれのパスと必要なlibファイルを設定すればビルドすることはできます。
この5年くらいはmacでの開発が多かったので、OpenCVをすぐ使いたいと思った時にPythonを使って pip install opencv-python でパッケージをインストールすれば使っています。

で、C++でmacで使おうと思った時にどうやってダウンロードと設定すればいいのかがよくわからんかったのでまとめてみました。

方法

Homebrewを使ってopenCVをインストールする

brew install opencv

/usr/local/Cellar/opencv/ 配下にダウンロードされます。 includeフォルダパスは /usr/local/Cellar/opencv/4.1.1_2/include/opencv4/ 、 libフォルダパスは /usr/local/Cellar/opencv/4.1.1_2/lib/ でそれぞれにヘッダーファイルとlibファイルが格納されています。

表示に使う画像


みかん星人です。

コードを作成する

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui.hpp>

int main(int argc, const char* argv[]) {

     //モノクロ画像で格納
    cv::Mat image = cv::imread("./mikan.jpg" , 0);
    if (image.empty()) {
        std::cout << "read error.\n";
        return -1;
    }


    while (true){
        const int key = cv::waitKey(1);
                //[q] を押すと終了 
        if (key == 'q'){
            break;
        }

        cv::namedWindow("Image", cv::WINDOW_AUTOSIZE);
        cv::imshow("Image", image);
    }

    cv::destroyAllWindows();

   return 0;
}

makefile を作成する

コマンドでパスの設定をする必要があるので下記のコマンドを打って出力ファイルを作成することができます。

c++ main.cpp -o main -I/usr/local/Cellar/opencv/4.1.1_2/include/opencv4/ \ 
-std=c++11 \
-L/usr/local/Cellar/opencv/4.1.1_2/lib/ \
-lopencv_core -lopencv_highgui -lopencv_imgcodecs

毎回このコマンドを打ってデバッグするのは結構面倒です。ここにopencv以外の外部ファイルを追加したい場合はこれよりも長くなります。長くなるとどこでビルドがエラーになっているかわかりにくい
なのでmakefileを作ってマクロ化します。

CXX = c++
CXXFLAGS =  -I/usr/local/Cellar/opencv/4.1.1_2/include/opencv4/
LDFLAGS = -L/usr/local/Cellar/opencv/4.1.1_2/lib/
LDLIBS =  -lopencv_core -lopencv_highgui -lopencv_imgcodecs
CXXVERSION = -std=c++11

main: main.cpp
    $(CXX) $< -o $@ $(CXXFLAGS) $(CXXVERSION) $(LDFLAGS) $(LDLIBS)

clean :
    rm main

CXXVERSION = -std=c++11 とあるのですが、最新のopenCV4系では明示する必要があります。c++の構文がc++11c++14c++17とバージョンアップしていてopenCVの構造がc++11以上の構文で書かれているっぽいです。そのため指定しないとエラーになります。

makefileができれば make コマンドだけで出力ファイルが作られます。

make
./main

結果

キーボード[q]を押すと閉じます。

おわり

makefileあるとコマンド一つなので楽です。

参考になりそうなリンク