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>