2014年1月3日金曜日

OpenCV2: cv::Matの要素の深度を変えたいんだけど → convertTo (但し8U/16U/32Fに限る)


[しつもん]
 CV_16UC1な16U深度のcv::Matがあるんだけどこれの深度を8Uに変えたいんだ、どうしたらいいかな?
[こたえ]
cv::Matのsrcとdstが用意してあるとして、src.convertTo(dst, CV_8U)でできるよ。 
はい、若干質疑内容を簡略化しちゃいましたが、そういう事です。cv::Mat::converToを使うと深度を変換したcv::Matを得ることができます。

そういう事なんですが、このcv::Mat::convertToには罠がありましたのでメモメモ。

[cv::Mat::convertToのわな]
src.convertTo(dst, CV64F);
↑とか書いて実行しちゃうわけです。すると↓

OpenCV Error: Assertion failed (depth == CV_8U || depth == CV_16U || depth == CV_32F) in cvtColor, file /build/buildd/opencv-2.4.5+dfsg/modules/imgproc/src/color.cpp, line 3352

terminate called after throwing an instance of 'cv::Exception'
  what():  /build/buildd/opencv-2.4.5+dfsg/modules/imgproc/src/color.cpp:3352: error: (-215) depth == CV_8U || depth == CV_16U || depth == CV_32F in function cvtColor

cv::mat::convertToの変換先はCV_8UCV_16UCV_32Fしか扱えないんだね(´・ω・`)

それはそうと、いえいえそれもそうですが、それはそうと、OpenCV2はCに呪われているので無理でしょうけれど、C++ APIではこういうのはassertじゃなくてstatic_assertにして欲しいですね(´・ω・`)

0 件のコメント:

コメントを投稿