OpenCVを利用した単純なCMakeプロジェクトの作成方法 (C++)

作成日:

本ページではOpenCVを利用した単純なアプリを作成する場合のCMakeファイルを解説します。利用言語はC++です。

環境:

  • OpenCV 4.6

  • CMake 3.16.3

  • Ubuntu 20.04

方法#

以下のようなディレクトリ構成の場合。

./
 +--- CMakeList.txt
 +--- src/
 |      +--- main.cpp
 +--- include/
        +--- header.h

CMaekLists.txt の中身を以下のようにします。

cmake_minimum_required(VERSION 3.4.3)

set(PROJECT_NAME opencv_app)
project(${PROJECT_NAME} LANGUAGES CXX)

set(SRC_FILES
    "src/main.cpp")

set(HEADER_FILES
    "include/header.h")

list(APPEND CMAKE_MODULE_PATH
    "${CMAKE_SOURCE_DIR}/cmake")

# OpenCVのパッケージを見つける
find_package(OpenCV REQUIRED)

# OpenCVのインクルードファイルの場所を設定
include_directories(${OpenCV_INCLUDE_DIRS})

# 実行ファイル生成コマンド
add_executable("${PROJECT_NAME}" "${SRC_FILES}" "${HEADER_FILES}")

# OpenCVのライブラリを設定する (add_executableの後でなければならない)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBRARIES})

説明#

CMakeではこの手の find_package を利用して外部ライブラリを利用することが多々あります。ほかのパッケージでも大体の場合で通用はするかと思います。

find_package#

find_package はその名の通りパッケージを見つけてくるコマンドです。引数をすべて示すと以下になります。

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
         [REQUIRED] [[COMPONENTS] [components...]]
         [OPTIONAL_COMPONENTS components...]
         [REGISTRY_VIEW  (64|32|64_32|32_64|HOST|TARGET|BOTH)]
         [GLOBAL]
         [NO_POLICY_SCOPE]
         [BYPASS_PROVIDER])

ここでは必要最低限のものだけ解説させていただきます。

find_package のオプション

オプション名

説明

PackageName

必要なパッケージの名称

version

必要なバージョンを示すことが可能

REQUIRED

存在しなければビルドができないときに設定する

今回の例では利用していませんが、 version を利用することでパッケージ作成時に利用するライブラリのバージョンを指定することができます。OpenCVなどは古いバージョンをそのまま利用しているユーザもいるため、明示しておいた方が無難かもしれません。

include_directories#

include_directories はコンパイラに対してインクルードファイルを指定するコマンドです。

本コマンドに指定している OpenCV_INCLUDE_DIRSfind_package に成功した場合に自動的に生成される変数で、OpenCVのヘッダへのパスが格納されています[1]

ソースからビルドしているならば、サンプルが存在する#

もしソースからビルドしてインストールしている場合、これらのCMakeList.txtのサンプルが同梱されています。

パッケージ内の samples/cpp/example_cmake/CMakeLists.txt などを参照してみてください。

OpenCV
C++