🗂

【VSCode】OpenCV C++のための環境構築

2024/06/15に公開

目標

  • Visual Studio Codeで、OpenCVのC++サンプルプログラムを実行する
  • Visual Studio Codeで、オリジナルのOpenCV C++プログラムを作成して実行する

環境

筆者が使用している環境は以下の通りです。

  • OS:Windows 11
  • ビルドツール:CMake (version 3.29.5)
  • C++コンパイラ:cl (Visual Studio Build Tools 2022) (version 17.10.2)

単純に操作感が好みじゃないので、Visual Studioのエディターは使いません。
手順については、GitHubからソースコードをダウンロードし、適宜ビルドして用いる方法について解説します。

インストーラでダウンロードし、環境変数を設定したりエディターの設定を編集して用いる方法はその他書籍や記事で解説されていると思うので割愛します。

手順

1.OpenCVソースコードのダウンロード

  • GitHub CLI導入済みの場合
    作業や一時使用などのための目的のディレクトリに移動し、VScodeのターミナルにて以下を実行
    gh repo clone opencv/opencv
    
  • Gitを用いない場合
    GitHub Releasesより、Source code (zip)をダウンロード。その後目的のディレクトリにてzipファイルを展開し、VScodeで確認。

2.CMakeのインストール

ダウンロードした多くのファイルの中に、CMakeLists.txtという名前のファイルが確認できるでしょうか。このファイルは、CMake*1を用いて、今後サンプルや自身が作成するソースファイルをビルドする際に必須のものです。
リンクより、Latest Release (3.29.5)のWindows x64 Installerをダウンロードします。

インストーラを起動したら、表示に従ってインストールを進めてください。途中以下の表示が出ますが、3つの選択肢のうち、下の2つのいずれかを選択してください。

インストールが完了したら、VScodeのターミナルで以下を実行します。

cmake --version

バージョンが表示されたら成功です。

*1 ビルドツールの一種。「ヘッダやライブラリをどのディレクトリから探してくるのか、どのファイルをソースファイルとするのか、どんな形式のファイルをビルドしたいのか」といった”ルール”をCMakeLists.txtというファイルに記述することで、ソースファイル群の分割コンパイルが一斉に実行され、目的のライブラリや実行可能ファイルをビルドすることができる。

Visual Studio Build Tools 2022 のインストール

リンクより、ダウンロードを選択してインストーラをダウンロードします。

インストーラを起動したら表示に従ってインストールを進めます。
こちらの記事が詳しいので、必要な方は手順を参考にしてください。

インストールが終了したら、windowsスタートメニューでDeveloper Command Prompt for VS 2022と検索し、起動します。

where clと実行して、パスが表示されることを確認してください。

OpenCVソースコードおよびサンプルのビルド

ソースコードのビルド

GitHubよりインストールしたOpenCVソースコードのディレクトリopencvに移動し、下記を実行します。

mkdir build
cmake -S . -B build

ビルド時の生成ファイルを吐き出す先としてmkdirディレクトリを作成、-Sオプションの後にCMakeLists.txtのパスを指定(今回は同ディレクトリなのでピリオド)、-Bオプションの後に生成ファイルの格納先(先ほど作成したbuild)のパスを指定しています。
より詳しくするならば-G "Visual Studio 17 2022"という指定を書きますが、デフォルトでVisual Studioのコンパイラを使うことになっているので特別指定は必要ありません。

実行すると表示がたくさん出ます。

最終的にBuild files have been written to: の表示が出ることを必ず確認してください。

次に以下を実行します。

cmake --build build

--buildオプションの後に、先ほどのコマンド実行の際に指定した生成ファイルの格納先ディレクトリのパスを指定します。

これもまたたくさん表示が出ます。先ほどよりも多くの時間がかかると思います。

途中で黄色の警告表示が出るかもしれませんが、失敗の旨を告げる警告が最後に表示されなければ問題ないと思います。

サンプルのビルド

opencv/samples/cpp/example_cmakeに移動し、先ほどと同じ要領で以下を実行します。

mkdir build
cmake -S . -B build

おそらく下記のエラーが出ます

そこでCMakeLists.txtの7行目に以下を追記します。CMakeはバックスラッシュ\に対応していないので、通常のスラッシュ/を用いてください

set(OpenCV_DIR path/to/opencv/build)

再度ビルドシステムの構築を行いますが、先ほどの生成ファイルは一度削除してから同じ手順を踏みます。以下を実行しましょう。

rm -r build
mkdir build
cmake -S . -B build

Generating done, Build files have been written toの表示が出れば成功です。

次に以下を実行します。

cmake --build build

build/Debugディレクトリにてopencv_example.exeが生成されていたら成功です。

サンプルの実行

先ほどのディレクトリにて以下を実行します。

start build/Debug/opencv_example

が、おそらく以下のエラーが出ます。

CMakeはtarget_link_libaries()関数でビルド時にリンクするライブラリを指定することはできますが、実行時のdll(dynamic link library)の依存関係までは扱っていないためです。

ここだけは環境変数を設定します。下記パスをPATHに登録します。

path/to/opencv/build/bin/Debug

環境変数へのパス登録を反映させるためvscodeを再起動し、もう一度サンプルを実行します。

cd path/to/sampels/cpp/example_cmake
build/Debug/opencv_example


プライバシーのため顔を隠しています

これで最初の目標を達成しました。

オリジナルのプログラムを作成して実行する

自分の場合は以下の手順をを踏みます。

1.プロジェクトのためのフォルダ作成
2.CMakeLists.txtの作成
3.ソースファイルの作成

今回は、ウェブカメラからの映像取得を行う基本的なプログラムを作成します。
作成したCMakeLists.txtファイルとソースファイルは以下の通りです。

  • CMakeLists.txt

    cmake_minimum_required(VERSION 3.1)
    
    project(example_basicWebcam)
    
    set(OpenCV_DIR C:/Users/<username>/vscode/Study/OpenCV/opencv/build) 
    
    find_package(OpenCV REQUIRED)
    
    add_executable(basicWebcam basicWebcam.cpp)
    
    target_link_libraries(basicWebcam PRIVATE ${OpenCV_LIBS})
    
  • basicWebcam.cpp (ソースファイル)

    #include <iostream>
    #include <opencv2/core.hpp>
    #include <opencv2/videoio.hpp>
    #include <opencv2/highgui.hpp>
    
    int main()
    {
        // open video capture device
        cv::VideoCapture cap(0);
    
        // check the device has already initialized
        if (!cap.isOpened())
        {
            std::cout << "camera is not opened" << std::endl;
            return -1;
        }
    
        // set capture settings
        cap.set(cv::CAP_PROP_FRAME_WIDTH, 1280);
        cap.set(cv::CAP_PROP_FRAME_HEIGHT, 1080);
        cap.set(cv::CAP_PROP_FPS, 60);
    
        // create Mat array to store image
        cv::Mat img;
    
        // create window to show capture image
        cv::namedWindow("window name", cv::WINDOW_AUTOSIZE);
    
        // capture
        while (true)
        {
            cap >> img;
    
            if (img.empty())
                break;
            cv::imshow("window name", img);
    
            // escape
            if (cv::waitKey(1) >= 0) // when any key pressed
                break;
        }
    
        // end capture
        cv::destroyAllWindows();
        return 0;
    }
    


それではビルドしていきます。

cd path/to/project directory
mkdir build
cmake -S . -B build
cmake --build build

成功したらbuild/Debug/basicWebcamで実行します。

先ほどよりも綺麗な映像が表示されるかと思います。

Discussion