LoginSignup
2
1

【C++】Visual Studio C++でOpenCVおよびLibtorchの始め方

Last updated at Posted at 2023-02-10

今回はVisual Studio C++でのOpenCVおよびtorchのC++版Libtorchの始め方を紹介する

Visual Studioのインストール

  1. Visual Studio のインストーラーをダウンロードする
    https://visualstudio.microsoft.com/ja/downloads/

  2. ダウンロードした次のいずれかのエディションのインストーラーをダブルクリックする

  3. Microsoft のライセンス条項とプライバシーに関する声明の確認を求められるため、続行を押す
    privacy-and-license-terms.png

  4. C++ によるデスクトップ開発を選択して、インストールをクリックする
    vs-installer-workloads.png

  5. 諸々オプションの設定をして、Installを押す

OPenCVをダウンロードして展開する

  1. 以下のサイトからWindowsを選択して、OpenCVのソースコードのインストーラーをダウンロードする

    https://opencv.org/releases/

  2. ダウンロードしたファイルをクリックして、C:/を選択し、C:/にファイルを展開する

C++用torchライブラリをダウンロードして展開する

C++用torchライブラリであるLibtorchをダウンロードして展開する

  1. 下記リンクからLibtorchをCPU版かGPU版のDebug/release用それぞれダウンロードする
    https://pytorch.org/
  2. ダウンロードしたzipを任意のフォルダに展開する

NVIDIAのインストールする※GPU使用の場合

  1. CUDA Toolkitのインストーラーをダウンロードする
    https://developer.nvidia.com/cuda-downloads
  2. インストーラーを実行して、インストールする
  3. cuDNNをインストールする
    https://developer.nvidia.com/rdp/cudnn-archive

Visual Studioの設定・ビルド

  1. Visual Studio を起動し、新しいプロジェクトを作成する
  2. プロジェクト->モジュールの追加から.cppファイルを追加する
    Visual_Studio_1.PNG
    Visual_Studio_2.PNG
  3. プロジェクト->プロパティを押して、現在表示しているプロジェクトの設定ページを表示する
    Visual_Studio_3.PNG
  4. 左上の構成からデバックかリリースを選択する
    デバック環境とリリース環境を分けて設定できる
  5. C/C++->全般を押して、追加のインクルードディレクトリをクリックして、編集を押す
    Visual_Studio_4.PNG
  6. 空いているところをクリックして、追加したいヘッダーのパスをコピペして、OKを押す
    C:\Program Files (x86)\OpenCV\opencv\build\include
    
  7. リンカー->全般を押して、追加のライブラリディレクトリをクリックして、編集を押す
    Visual_Studio_5.PNG
  8. 空いているところをクリックして、追加したいライブラリのパスをコピペして、OKを押す
    C:\Program Files (x86)\OpenCV\opencv\build\x64\vc16\lib
    
  9. 構成プロパティ->デバッグを押して、環境に下記の動的リンクライブラリのパスをコピペして、OKを押す。もしくはPCのシステムの環境変数に下記を追加
    C:\Program Files (x86)\OpenCV\opencv\build\x64\vc16\bin
    
    Visual_Studio_6.PNG
  10. 下記のOpenCVのコードを編集画面にコピペする
  11. 緑色の三角ボタンを押して、デバックモードでビルドする
  12. モードをDebugからreleaseに変更して、ビルド->ソリューションのビルド押して、リリース用exeファイルを作成する

下記のような画面が表示されたら、正常にビルドできている。
Visual_Studio_7.PNG

OpenCVのC++コード

引数に入力動画を渡して、ただoutput.mp4という名前で保存するだけのプログラム。

output.cpp
#if _DEBUG
#pragma comment(lib, "opencv_world470d.lib")
#else
#pragma comment(lib, "opencv_world470")
#endif

#include <iostream>
#include <thread>
#include <memory>
using namespace std;

#include <opencv2/opencv.hpp>
using namespace cv;

#include "opencv2/highgui/highgui.hpp" //動画を表示する際に必要

constexpr int TIME_TO_SLEEP = 10000;

int main(int argc, const char* argv[])
{
    Mat img(Size(640, 360), CV_8UC3);
    Mat gray_img(Size(640, 360), CV_8UC1);
    Mat gaussian_img(Size(640, 360), CV_8UC1);
    Mat bin_img(Size(640, 360), CV_8UC1);
    Mat canny_img(Size(640, 360), CV_8UC1);

    if (argc != 2)
    {
        cout << "" << endl;
        cout << " Error" << endl;
        cout << "" << endl;
        cout << " How to use : cout.exe sample.mp4" << endl;
        cout << "" << endl;
        cout << " argv:" << endl;
        cout << " cout.exe   : this program name" << endl;
        cout << " sample.mp4 : input movie file path" << endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(TIME_TO_SLEEP));
        return 0;
    }

    std::string VideoFile = argv[argc - 1];

    VideoCapture cap;
    cap.open(VideoFile);

    if (!cap.isOpened())
    {
        std::cerr << "cannot open this movie file!" << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(TIME_TO_SLEEP));
        return -1;
    }

    int    fourcc, width, height;
    double fps;
    width = (int)cap.get(cv::CAP_PROP_FRAME_WIDTH);	// フレーム横幅を取得
    height = (int)cap.get(cv::CAP_PROP_FRAME_HEIGHT);	// フレーム縦幅を取得
    fps = cap.get(cv::CAP_PROP_FPS);					// フレームレートを取得
    double max_frame = cap.get(CAP_PROP_FRAME_COUNT);
    fourcc = cv::VideoWriter::fourcc('m', 'p', '4', 'v');	// AVI形式を指定
    VideoWriter Videowriter("output.mp4", fourcc, fps * 2, cv::Size(width, height), true);

    
    cv::Mat frame;
    for (int i = 0; i < int(max_frame); i++)
    {
        cap >> frame;

        if (frame.empty() == true) {
            continue;
        }

        int n = (int)cap.get(cv::CAP_PROP_POS_FRAMES);
        cout << n << endl;

        cv::imshow("再生中", frame);
        Videowriter << frame;
        cv::waitKey(1);
    }

    std::this_thread::sleep_for(std::chrono::milliseconds(TIME_TO_SLEEP));
    return 0;

}

実行

生成された.exeに入力動画をドラッグ&ドロップをクリックする
もしくは、以下のように実行する

output.exe input.mp4

Visual Studioの拡張機能でC++版Torchをビルドする

Visual Studio 拡張機能のlibtorchはversion 2019と2022のみ対応している。

  1. 適当なプロジェクトを開き、上部の拡張機能->拡張機能の管理を押す
  2. libtorchを検索して、libtorchの拡張機能をインストールする
  3. インストールするため、一旦すべて閉じる
  4. 新しいプロジェクトの作成を押す
  5. TorchProjectを選択する
  6. 作成を押して、先ほどダウンロードしたlibtorchのパスを追加する
    Visual_Studio_8.PNG
  7. 作成を押す
  8. プロジェクト->プロパティを押して、構成プロパティ -> 全般のWindowsSDKバージョンを「10.0 (最新のインストールされているバージョン)」に変更する。
    Visual_Studio_8.PNG
  9. サンプルが表示された状態で出てくるので、ビルドする。
  10. 実行すると以下のように表示される
CUDA is not available! Training on CPU
 0.0290  0.8719  0.2656
 0.1600  0.4686  0.1587
[ CPUFloatType{2,3} ]

GPU利用版

  1. 下記サイトに従い、NVIDIA Driver, CUDA ToolKit, cuDNN(コピペ)をインストールする
    https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html

  1. Windows SDK バージョン 10.*****がないといわれるので、下記を実行し、Windows SDKをインストールする。
    "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe"
    VSversion.PNG

まとめ

今回は、Visual Studio C++でOpenCVおよびC++用torchライブラリLibtorchの始め方を紹介した。

参考文献

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1