はじめに
WindowsでOpenCVを使いたいと思ったとき、公式(https://opencv.org/releases/)からビルド済みのインストーラをダウンロードして確認すると、vc++でビルドされたものであることがわかります。
Visual Studioを使っているなら問題ないのですが、自分のように普段MinGWを使っている場合、このモジュールにパスを通してg++ビルドしようとするとリンカでエラーが発生してしまいます。
解決策としてMinGWでOpenCV本体からソースビルドする方法があるので、そちらを試しつつ、Windowsでの開発準備の過程をまとめてみます。
環境
- Windows10(Windows11でも同じ手順で成功しました)
- g++ 13.1.0
- make 3.81
- cmake 3.27.0 RC3
ビルド
インストール
MinGW
目的に合うものを選択する。よくわからなければ、試しに遊ぶだけなら大きな差はないので、一番上の「x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0.7z」で問題ないかと。
make
cmake
環境変数を設定
インストールした各binにパスを通します。自分の場合は以下のディレクトリをPATH
に設定しました。
- C:\Users\hogehoge\mingw64\bin
- C:\Program Files (x86)\GnuWin32\bin
- C:\Program Files\CMake\bin
OpenCVのソースコード入手
直接ダウンロードするか、GitHubからcloneするかしてソースコードを適当なディレクトリに配置する。自分の場合は「Sources」からダウンロードしました。
buildディレクトリを作る
ソースディレクトリ内にbuild
ディレクトリを作成します。
cmake
CmakeGUIを開き、まずconfigureを行います。
CmakeGUIの「Where is the source code」にダウンロードしたOpenCVのトップディレクトリを指定します。次に、「Where to build the binaries」にOpenCVのトップディレクトリの下のbuild
ディレクトリを指定します。最後に、Configureボタンを押します。
どのジェネレータを使用するか問われるので、「MinGW Makefiles」を指定し、Finishを押すとconfigureが走るので、しばらく待ちます(コンソール画面にエラーメッセージのようなものがチラチラ見えますが問題ないです)。
cmakeパラメータ設定
configureが終わると中央の表に赤い項目が沢山並びます。ここを1つずつ確認しながら、パラメータを決めていきます。
自分の場合は、Javaは不要だったのでBUILD_JAVA
を外すなどしました。
DOPENCV_ALLOCATOR_STATS_COUNTER_TYPEを追加
ここが重要です。「Add Entry」ボタンを押すと任意のパラメータを設定できるので、以下項目を追加します。
- Name: DOPENCV_ALLOCATOR_STATS_COUNTER_TYPE
- Type: STRING
- Value: int64_t
参考
https://github.com/opencv/opencv/issues/16990
完了したら、再度「Configure」を押したあと、「Generate」でMakeFileを生成します。
make
build
ディレクトリにMakefileが生成されていることを確認し、ターミナルを開いてmakeを実行します。
make
make install
すべてエラーなく終了したら、ビルドは完了です。build/install/
にincludeとlibがインストールされます。
動作確認
環境変数
以下の2つをPATH
に追加しておきます。1つめのbin
を登録しておくことで、実行時に必要なdll(libopencv_world490.dll
など)をOSが見つけられるようになります。また2つめのlib
を登録しておくことで、cmakeがfind_package
でOpenCVを検索できるようになります。
...\opencv-4.9.0\build\install\x64\mingw\bin
...\opencv-4.9.0\build\install\x64\mingw\lib
開発プロジェクトを作る
以下のディレクトリ構成でopencv_test
プロジェクトを準備します。
opencv_test
├─src
│ └─main.cpp
├─build
└─CMakeLists.txt
CMakeLists.txtを作成
cmake_minimum_required(VERSION 3.21)
project(opencv_test CXX)
find_package(OpenCV REQUIRED)
file(GLOB MY_SOURCE src/*)
add_executable(${PROJECT_NAME} ${MY_SOURCE})
target_include_directories(
${PROJECT_NAME}
PRIVATE
${OpenCV_INCLUDE_DIRS}
)
target_link_libraries(
${PROJECT_NAME}
PRIVATE
${OpenCV_LIBS}
)
find_package
で利用可能になるOpenCVの変数${OpenCV_INCLUDE_DIRS}
や${OpenCV_LIBS}
がわからなくなった場合は、OpenCVConfig.cmake
の中を読めば一覧を確認できます。
・・・(略)・・・
# This file will define the following variables:
# - OpenCV_LIBS : The list of all imported targets for OpenCV modules.
# - OpenCV_INCLUDE_DIRS : The OpenCV include directories.
# - OpenCV_COMPUTE_CAPABILITIES : The version of compute capability.
# - OpenCV_ANDROID_NATIVE_API_LEVEL : Minimum required level of Android API.
# - OpenCV_VERSION : The version of this OpenCV build: "4.9.0"
# - OpenCV_VERSION_MAJOR : Major version part of OpenCV_VERSION: "4"
# - OpenCV_VERSION_MINOR : Minor version part of OpenCV_VERSION: "9"
# - OpenCV_VERSION_PATCH : Patch version part of OpenCV_VERSION: "0"
# - OpenCV_VERSION_STATUS : Development status of this build: ""
・・・(略)・・・
main.cppを作成
上記サンプルをそのままコピペして、USBカメラからvideoio
を使って画像を取得し、エッジ検出した結果を描画するプログラムを作ってみます。
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat edges;
namedWindow("edges",1);
for(;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
cvtColor(frame, edges, COLOR_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("edges", edges);
if(waitKey(30) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
ビルド&実行
cd build
cmake .. -G "MinGW Makefiles" # -GでジェネレータにMinGWを指定しないとエラーになる
make
.\opencv_test.exe
できた!!