OpenCV + opencv_contrib を Windows でビルドする完全ガイド【C++/VS2022】

OpenCV for C++
📌 準備: OpenCV の環境構築がまだの方はこちら → C++ 環境構築ガイドC#(OpenCvSharp)セットアップ

OpenCV + opencv_contrib を Windows でビルドする完全ガイド【C++/VS2022】

この記事では、Windows 上で OpenCV のソースコードを opencv_contrib(外部モジュール)込みで CMake を使ってビルドし、Visual Studio 2022 で使える状態にするまでの手順を解説します。

公式の Windows 向けインストーラーには contrib モジュールが含まれていません。SURF・FREAK(xfeatures2d)・顔ランドマーク検出(face モジュール)・ximgproc などを使いたい場合は、自前でソースビルドが必須です。

⚠️ SIFT は OpenCV 4.4 以降、ArUco は 4.7 以降でそれぞれ本体に統合されました。これらは contrib ビルドなしで使えます。contrib が必要な代表例は SURF・FREAK(xfeatures2d) です。


前提環境

項目 バージョン
OS Windows 11 / Windows 10 (64bit)
Visual Studio 2022 Community(C++ デスクトップ開発ワークロード)
CMake 3.28 以降(cmake.org 公式)
OpenCV 4.10.x(opencv.org/releases/)
opencv_contrib 4.10.x(OpenCV 本体と同一バージョン)
Python 不要(C++ ビルドのみ)

⚠️ OpenCV 本体と opencv_contrib のバージョンは 完全に一致 させてください。マイナーバージョンのズレでも CMake Configure がエラーになります。


手順

1. Visual Studio 2022 のインストール

https://visualstudio.microsoft.com/ja/downloads/ から Community 版をダウンロードします。

インストーラーを起動したら 「C++ によるデスクトップ開発」 ワークロードにチェックを入れてインストールしてください。MSVC v143 ツールセットと Windows SDK が同時に入ります。

2. CMake のインストール

https://cmake.org/download/ から Windows x64 の .msi インストーラーをダウンロードします。

インストール中に 「Add CMake to the system PATH for all users」 を選択し、PATH を通してください。インストール後、動作確認します。

cmake --version
# cmake version 3.28.x

3. ソースコードのダウンロード

以下の 2 つをダウンロードし、展開先を揃えておくと管理が楽です。

展開後のディレクトリ構成(例):

C:\opencv_src\
  opencv-4.10.0\        ← OpenCV 本体ソース
  opencv_contrib-4.10.0\  ← contrib ソース
C:\opencv_build\        ← CMake のビルド出力先(空フォルダを事前に作成)
C:\opencv\              ← インストール先(cmake --install の出力先)

opencv_buildopencv(インストール先)フォルダは手動で作成しておきます。

mkdir C:\opencv_build
mkdir C:\opencv

4. CMake GUI による Configure & Generate

CMake GUI(cmake-gui)を起動し、以下を入力します。

フィールド
Where is the source code C:/opencv_src/opencv-4.10.0
Where to build the binaries C:/opencv_build

Configure」をクリックします。初回はジェネレーター選択ダイアログが出ます。

Generator: Visual Studio 17 2022
Platform:  x64

Configure が完了(赤いハイライト行が並んだ状態)したら、以下のエントリを設定します。

CMake 変数
OPENCV_EXTRA_MODULES_PATH C:/opencv_src/opencv_contrib-4.10.0/modules
CMAKE_INSTALL_PREFIX C:/opencv
BUILD_opencv_world ✅ ON
OPENCV_ENABLE_NONFREE ✅ ON(SURF 等の非フリーアルゴリズムを使う場合)
BUILD_TESTS OFF(ビルド時間削減)
BUILD_PERF_TESTS OFF(同上)

OPENCV_EXTRA_MODULES_PATH の入力後に再度「Configure」を実行してください。赤いハイライトが消えたら「Generate」をクリックします。

-- Configuring done
-- Generating done
-- Build files have been written to: C:/opencv_build

上記が表示されれば Generate 完了です。

5. Visual Studio でビルド & インストール

Generate が終わると C:\opencv_build\OpenCV.sln が生成されます。

方法 A: cmake コマンドでビルド(推奨)

Developer Command Prompt for VS 2022 または PowerShell で実行します。

cmake --build C:\opencv_build --config Release --parallel
cmake --install C:\opencv_build --config Release

--parallel オプションで論理コア数を使い切ってビルドします。コア数によりますが 15〜30 分程度かかります。

方法 B: Visual Studio IDE でビルド

OpenCV.sln を Visual Studio 2022 で開き、構成を Release / x64 に変更後、ソリューションエクスプローラーから INSTALL プロジェクトをビルドします。

6. 環境変数の設定

ビルド完了後、インストール先の DLL を Windows が見つけられるよう PATH を追加します。

C:\opencv\x64\vc17\bin

システム環境変数 Path に追加後、PC を再起動またはシェルを再起動してください。


動作確認

contrib が正しくビルドされているかを確認するプログラムです。ORB(本体)でキーポイント検出、FREAK(xfeatures2d) で記述子計算を行います。FREAK が動けば contrib リンクが通っている証明になります。

#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>  // contrib: FREAK

int main()
{
    // グレースケール画像を生成(テスト用)
    cv::Mat img = cv::Mat::zeros(400, 400, CV_8UC1);
    cv::rectangle(img, {50, 50}, {350, 350}, cv::Scalar(200), 3);
    cv::circle(img,    {200, 200}, 80,        cv::Scalar(150), 2);

    // ORB でキーポイント検出(本体モジュール)
    auto orb = cv::ORB::create(500);
    std::vector<cv::KeyPoint> keypoints;
    orb->detect(img, keypoints);
    std::cout << "ORB keypoints: " << keypoints.size() << std::endl;

    if (keypoints.empty()) {
        std::cerr << "キーポイントが検出されませんでした。" << std::endl;
        return 1;
    }

    // FREAK で記述子計算(contrib: xfeatures2d)
    cv::Mat descriptors;
    auto freak = cv::xfeatures2d::FREAK::create();
    freak->compute(img, keypoints, descriptors);
    std::cout << "FREAK descriptors: "
              << descriptors.rows << " x " << descriptors.cols << std::endl;

    // キーポイントを描画して保存
    cv::Mat output;
    cv::drawKeypoints(img, keypoints, output,
                      cv::Scalar::all(-1),
                      cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
    cv::imwrite("result.png", output);
    std::cout << "result.png を出力しました。" << std::endl;

    return 0;
}

Visual Studio でのプロジェクト設定(Release / x64 前提):

項目 設定値
追加のインクルードディレクトリ C:\opencv\include
追加のライブラリディレクトリ C:\opencv\x64\vc17\lib
追加の依存ファイル opencv_world4100.lib

BUILD_opencv_world を ON にしてビルドしたため、opencv_world4100.lib 1 ファイルのリンクで全モジュール(contrib 含む)が使えます。バージョン番号部分(4100)は実際のバージョンに合わせてください。

実行結果:

ORB keypoints: 248
FREAK descriptors: 248 x 64
result.png を出力しました。

FREAK descriptors の行が出力されれば contrib のビルドとリンクが成功しています。


つまずきポイント

① opencv_world vs 個別 lib のリンクエラー(LNK2019)

BUILD_opencv_world を ON にした場合は opencv_world4100.lib をリンクします。OFF の場合は opencv_core4100.libopencv_xfeatures2d4100.lib のように個別に列挙が必要です。両方を混在させると重複シンボルエラーになるので注意してください。

Debug ビルドでは末尾に d が付く opencv_world4100d.lib を使います。Release ビルドで d 付き lib をリンクすると実行時クラッシュします。プロジェクトの構成ごとに正しく使い分けてください。

② opencv2/xfeatures2d.hpp が見つからない

contrib のヘッダーは C:\opencv\include\opencv2\xfeatures2d.hpp に配置されます。インクルードディレクトリに C:\opencv\include を指定していれば解決します。
もし cmake –install を実行していない場合はヘッダーがコピーされません。INSTALL プロジェクトのビルドを忘れずに行ってください。

③ OPENCV_EXTRA_MODULES_PATH のパス末尾に注意

OPENCV_EXTRA_MODULES_PATH に指定するのは opencv_contrib-4.10.0/modules ディレクトリです。opencv_contrib-4.10.0 のルートを指定すると「No modules directory」エラーになります。Configure 後に CMake の出力ログで contrib モジュールが列挙されていることを確認してください。

--   Extra modules:
--     Location (extra): C:/opencv_src/opencv_contrib-4.10.0/modules
--     Version control: unknown

まとめ

ステップ 概要
1〜2 Visual Studio 2022・CMake のインストール
3 OpenCV 本体と opencv_contrib を同一バージョンで取得
4 CMake GUI で OPENCV_EXTRA_MODULES_PATHBUILD_opencv_world を設定
5 cmake --buildcmake --install でビルド & インストール
6 PATH 追加、opencv_world4100.lib リンクで開発開始

contrib のビルドが必要になる典型的なケースは SURF・FREAK などの xfeatures2d モジュールや、faceximgproc などの研究向けモジュールです。一度ビルド環境を整えてしまえば、バージョンアップ時も同じ手順で対応できます。

🛠 画像処理のプロが開発するSDK/API

本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/API(C++製・OpenCV 4.10)を開発しています。顔認証システムへの組み込み実績多数。

→ なりすまし判定SDK/APIの詳細を見る
→ API仕様書・サンプルコード

タイトルとURLをコピーしました