17
Help us understand the problem. What are the problem?

posted at

updated at

CMakeでOpenCVアプリケーション開発

この記事について

CMakeを使って、OpenCVアプリケーション開発用プロジェクトを作ります。WindowsとLinuxの両方でビルドできるようにします。

  • CMakeを使うことのメリット
    • マルチプラットフォーム対応
    • インクルードパスやライブラリ設定を自動化できる
    • (特に、GitHub等で他の人に渡すときに便利)

環境

  • Windows10 64-bit
    • Visual Studio 2017 Community
  • Ubuntu 16.04 on VirtualBox on Windows 10
  • OpenCV 3.4.1

対象とするプログラム

定番の、Lenaさんを表示するだけのOpenCVプログラムを考えます。

main.cpp
#include <stdio.h>
#include <opencv2/opencv.hpp>

int main()
{
    printf("Hello\n");

    cv::Mat image = cv::imread(RESOURCE_DIR"lena.jpg");
    cv::imshow("Display", image);

    cv::waitKey(0);
    return 0;
}

OpenCVの準備

Windows

OpenCVの取得

カスタマイズ不要なら、公式(https://opencv.org/ )から配布されているバイナリを使用するのが楽です。
https://opencv.org/opencv-3-4-1.html に行き、DownloadのWin packをクリック。
ダウンロードしたopencv-3.4.1-vc14_vc15.exeを展開後、c:\opencvに配置。

環境変数の設定

Windowsのシステムのプロパティ→環境変数で、環境変数を設定し、パスも追加します。
- OpenCV_DIR: C:\opencv\build
- Path: %OpenCV_DIR%\x64\vc15\bin を追加

Linux (Ubuntu)

だいぶ前にインストールしたので、忘れてしまいました。
とりあえず試すだけなら、aptでのインストールで大丈夫だと思います。最新版が使いたい場合は、ソースからビルドして、最後にインストールすればOKです。
もしかしたら、export OpenCV_DIR=OpenCVの場所をしておく必要があるかもしれません。

プロジェクトの作成

└─TestOpenCV
    │  CMakeLists.txt
    │  main.cpp
    │
    └─resource
            lena.jpg
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(MyOpenCVProject)

# Copy resouce
file(COPY ${CMAKE_SOURCE_DIR}/resource/ DESTINATION ${PROJECT_BINARY_DIR}/resource/)
add_definitions(-DRESOURCE_DIR="${PROJECT_BINARY_DIR}/resource/")

# Create Main project
set(SOURCES
    main.cpp
)

set(HEADERS
    # main.h
)

add_executable(Main
    ${SOURCES}
    ${HEADERS}
)


# For OpenCV
find_package(OpenCV REQUIRED)
if(OpenCV_FOUND)
    target_include_directories(Main PUBLIC ${OpenCV_INCLUDE_DIRS})
    target_link_libraries(Main ${OpenCV_LIBS})
endif()


CMakeを使うと、一般的にはout of sourceビルドといい、ソースコードとビルドする場所が異なります。そのため、画像等のリソースファイルをいちいちコピーするのが面倒なので、resourceフォルダを自動的にコピーして、その場所を定義しておくようにしました。
次に、main.cppを使って、Mainという実行ファイルを作っています。
最後に、OpenCVパッケージを探して、見つかったらincludeパス設定と、ライブラリリンク設定をしています。

(おまけ) セルフビルドした、指定の場所にあるOpenCVを使いたいとき

cmake時に、OpenCV_DIROpenCVConfig.cmakeの場所へのパス を設定する

# OpenCVのビルド
apt -y install git libgtk-3-dev libdc1394-22 libdc1394-22-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavresample-dev
git clone https://github.com/opencv/opencv.git --branch 4.5.5 --depth 1
cd opencv && mkdir -p build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=./install
make -j4
make install

# 自分のプロジェクトの生成
source /root/opencv/build/install/bin/setup_vars_opencv4.sh
cd 自分のプロジェクト && mkdir -p build && cd build
cmake .. -DOpenCV_DIR=/root/opencv/build
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
17
Help us understand the problem. What are the problem?