OpenCV 2系から3系への変更点

OpenCVが2系になりIplImageという負の遺産がなくなって早数年、OpenCVがついにver.3になりましたね。

まだbeta版ですが、ver.3になり、よりC++っぽい書き方に近づきつつある気がします。

2系から3系への変更点を気づいたところから備忘録的にまとめておきます。


cv::imread

2系


cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_COLOR);

3系


cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);

変更点
グローバルのenumだったCV_LOAD_IMAGE_XXXXがcv::IMREAD_XXXXとcv名前空間内に移動され、かつ名前が変わっています。


cv::cvtColor

<p>
  <strong>2系</strong>
</p>

```c++

cv::Mat gray = cv::cvtColor(rgb, CV_BGR2GRAY);

    
    <p>
      <strong>3系</strong>
    </p>
    
    ```c++

cv::Mat gray = cv::cvtColor(rgb, cv::COLOR_BGR2GRAY);
<p>
  <strong>変更点</strong><br /> 色空間をどのように変えるかを表していた第2引数がCV_XXXXという形式からcv::COLOR_XXXXという形式に変わりました。
</p>

<hr />

<p id="termcrit">
  <h2>
    cv::TermCriteria
  </h2>
  
  <p>
    <strong>2系</strong>
  </p>
  
  ```c++

cv::TermCriteria criteria(CV_TERM_CRIT_EPS | CV_TERM_CRIT_ITER, 20, 1.0);

      
      <p>
        <strong>3系</strong>
      </p>
      
      ```c++

cv::TermCriteria criteria(cv::TermCriteria::EPS | cv::TermCriteria::COUNT, 20, 1.0)
  <p>
    <strong>変更点</strong><br /> 終了条件を表すフラグがグローバルなenumからcv::TermCriteriaのenumに変更されています。
  </p>
  
  <hr />
  
  <p id="videocapture">
    <h2>
      cv::VideoCapture::get
    </h2>
    
    <p>
      <strong>2系</strong>
    </p>
    
    ```c++

cv::VideoCapture cap(“video.avi”); double width = cap.get(CV_CAP_PROP_FRAME_WIDTH);

        
        <p>
          <strong>3系</strong>
        </p>
        
        ```c++

cv::VideoCapture cap("video.avi");
double width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    <p>
      <strong>変更点</strong><br /> こちらもenumがグローバルからcv名前空間内に移動されています(素晴らしい!)。
    </p>
    
    <hr />
    
    <p id="pca">
      <h2>
        cv::PCA
      </h2>
      
      <p>
        <strong>2系</strong>
      </p>
      
      ```c++

cv::PCA pca(data, cv::Mat(), CV_PCA_DATA_AS_ROW);

          
          <p>
            <strong>3系</strong>
          </p>
          
          ```c++

cv::PCA pca(data, cv::Mat(), cv::PCA::DATA_AS_ROW);
      <p>
        <strong>変更点</strong><br /> cv::Matの入力データdataが行と列のどちらを1つのベクトルとするのかを表すenumがグローバルからcv::PCAの内部に移動されています。
      </p>
      
      <hr />
      
      <p id="misc">
        <h2>
          その他の変更点
        </h2>
        
        <p>
          <strong>CV_RGBの消滅</strong>
        </p>
        
        <p>
          完全にcv::Scalarで置き換えられました。
        </p>