VisualStudio2019 + OpenCV4.5.0 + CUDA10.1 + VideoCodecSDK10.0 のサンプルコード確認

# VisualStudio2019 + OpenCV4.5.0 + CUDA10.1 + VideoCodecSDK10.0 のサンプルコード確認

## サンプル

- サンプルコード
  - E:/Program/OpenCV/opencv/sources/samples
- サンプルデータ
  - E:/Program/OpenCV/opencv/sources/samples/data
      - 以下にコピー
          - E:/Program/OpenCV/build/modules
          - E:/Program/OpenCV/build/samples

### /gpu

#### alpha_comp.cpp

- アルファ合成
  - #include "opencv2/cudaimgproc.hpp"
      - cv::cuda::alphaComp

#### bgfg_segm.cpp

- 動画の読み込み
  - #include "opencv2/video.hpp"
      - cv::VideoCapture cap
- 背景差分
  - #include "opencv2/cudabgsegm.hpp"
      - cv::cuda::createBackgroundSubtractorMOG
      - cv::cuda::createBackgroundSubtractorMOG2
  - mog->apply(d_frame, d_fgmask, 0.01)
      - 動画から黒背景、白動体を出力する
  - mog->getBackgroundImage(d_bgimg)
      - 動画から動体を除く背景を出力する
  - d_frame.copyTo(d_fgimg, d_fgmask)
      - 動画から動体を切り出し出力する

#### cascadeclassifier.cpp

- コマンドライン引数
  - --cascade E:/Program/OpenCV/opencv/sources/data/haarcascades_cuda/haarcascade_frontalface_alt.xml E:/Program/OpenCV/opencv/sources/samples/winrt/FaceDetection/FaceDetection/Assets/group1.jpg
- 顔認識
    - #include "opencv2/cudaobjdetect.hpp"
        - cv::cuda::CascadeClassifier

#### farneback_optical_flow.cpp

- フレーム間の動体の移動量
  - #include "opencv2/cudaoptflow.hpp"
      - cv::cuda::FarnebackOpticalFlow
- GpuMatの配列（InputOutputArray）を分割する
  - #include "opencv2/cudaarithm.hpp"
      - cv::cuda::split

#### generalized_hough.cpp

- E:/Program/OpenCV/opencv/sources/samples/data/templ.png
  - 以下にコピー
      - E:/Program/OpenCV/build/samples/gpu
- コマンドライン引数
  - --gpu --votesThreshold=200
- 汎用化ハフ変換を使用して任意のオブジェクトを検索する
  - #include "opencv2/cudaimgproc.hpp"
      - cv::cuda::createGeneralizedHoughBallard
      - cv::cuda::createGeneralizedHoughGuil

#### hog.cpp

- コマンドライン引数
  - --video ../data/vtest.avi
- 動体検知
  - #include "opencv2/cudaobjdetect.hpp"
      - cv::cuda::HOG

#### houghlines.cpp

- エッジ検出
  - #include "opencv2/imgproc.hpp"
      - cv::Canny
- ハフ変換を使用したライン検出
  - #include "opencv2/cudaimgproc.hpp"
      - cv::cuda::createHoughSegmentDetector

#### morphology.cpp

- 画像の膨張・収縮によるノイズ除去
  - #include "opencv2/cudafilters.hpp"
      - cv::cuda::createMorphologyFilter

#### multi.cpp

- マルチCUDAデバイス
  - 環境なし

#### pyrlk_optical_flow.cpp

- コマンドライン引数
  - --left=../data/basketball1.png --right=../data/basketball2.png
- 特徴点検出
  - ```#include <opencv2/cudaimgproc.hpp>```
      - cv::cuda::createGoodFeaturesToTrackDetector
- Lucas-Kanade法を用いたフレーム間の動体の移動量
  - ```#include <opencv2/cudaoptflow.hpp>```
      - cv::cuda::SparsePyrLKOpticalFlow
      - cv::cuda::DensePyrLKOpticalFlow

#### stereo_match.cpp

- コマンドライン引数
  - --left ../data/aloeL.jpg --right ../data/aloeR.jpg --ndisp 120
- 視差画像を用いた奥行き推定
  - #include "opencv2/cudastereo.hpp"
      - cv::cuda::StereoBM
      - cv::cuda::StereoBeliefPropagation
      - cv::cuda::StereoConstantSpaceBP

#### stereo_multi.cpp

- コマンドライン引数
  - ../data/aloeL.jpg ../data/aloeR.jpg
- マルチCUDAデバイス
  - 環境なし

#### super_resolution.cpp

- コマンドライン引数
  - --video=../data/vtest.avi --output=../data/vout.avi --gpu=cuda
- 入力信号の解像度を高めて出力信号を作る
  - #include "opencv2/superres/optical_flow.hpp"
      - cv::superres::createOptFlow_Farneback_CUDA
      - cv::superres::createOptFlow_DualTVL1_CUDA
      - cv::superres::createOptFlow_Brox_CUDA
      - cv::superres::createOptFlow_PyrLK_CUDA
  - #include "opencv2/superres.hpp"
      - cv::superres::createSuperResolution_BTVL1_CUDA
      - cv::superres::createFrameSource_Video_CUDA
  - 1フレーム目:106sec
      - 以降:18sec

#### surf_keypoint_matcher.cpp

- コマンドライン引数
  - --left ../data/box.png --right ../data/box_in_scene.png
- 二枚の画像の特徴点のマッチング
  - #include "opencv2/cudafeatures2d.hpp"
      - cv::cuda::DescriptorMatcher::createBFMatcher

#### video_reader.cpp

- コマンドライン引数
  - ../data/Megamind.avi
- 動画の読み込み
  - ```#include <opencv2/cudacodec.hpp>```
      - cv::cudacodec::createVideoReader

#### video_writer.cpp

- コマンドライン引数
  - ../data/Megamind.avi
- エラー
  - E:/Program/OpenCV/opencv_contrib-4.5.0/modules/cudacodec/src/video_writer.cpp
      - ```#if !defined(HAVE_NVCUVENC) || !defined(_WIN32)```

      ```text
      OpenCV(4.5.0) E:\Program\OpenCV\opencv\sources\modules\core\include\opencv2/core/private.cuda.hpp:112: error: (-213:The function/feature is not implemented) The called functionality is disabled for current build or platform in function 'throw_no_cuda'
      ```

  - <https://github.com/opencv/opencv/issues/18271>
      - <https://github.com/opencv/opencv_contrib/pull/2180>
          - 4.1.0以降対応されていない？

### /cpp/tutorial_code/gpu

#### gpu-basics-similarity.cpp

- コマンドライン引数
  - ../data/basketball1.png ../data/basketball2.png 10
- 画質評価
  - PSNR（Peak signal-to-noise ratio）
      - CPU
      - CUDA
      - CUDA（GpuMat再利用）
  - SSIM（Structural Similarity）
      - CPU
      - CUDA
      - CUDA（GpuMat再利用）