私はかなり基本的なエッジ検出を行っています。私の実装の一部には、カスタム Image クラスから cv::Mat へのコピーと、Image へのコピーが含まれます。エッジ検出と輪郭の作業 (現在のリストには表示されていません) を行うためのガイドとして、この記事を使用しています。この例では、PerturbedBorderFilter は Image をサブクラス化します。ここに私が持っているものがあります:
void PerturbedBorderFilter::performFilter(const Image& src)
{
int h = src.Height(), w = src.Width();
cv::Mat
orig(h, w, CV_32FC3),
cannyOutput(h,w,CV_32FC1),
origGray(h,w,CV_32FC1);
src.copyTo(orig);
cv::cvtColor(orig, origGray, CV_RGB2GRAY);
cv::blur(origGray, origGray, cv::Size(3,3));
cv::Canny( origGray, cannyOutput, 0.1, 0.2, 3);
copyFrom(cannyOutput);
}
私はこのランタイムエラーで終わります:
OpenCV Error: Unsupported format or combination of formats () in cvCanny, file /build/buildd/opencv-2.3.1/modules/imgproc/src/canny.cpp, line 67
terminate called after throwing an instance of 'cv::Exception'
what(): /build/buildd/opencv-2.3.1/modules/imgproc/src/canny.cpp:67: error: (-210) in function cvCanny
私が知る限り、「origGray」と「cannyOutput」は同じタイプ、深さ、チャンネル数を共有しています。他に何をチェックすればよいかわかりません。
どういうわけか copyTo() と copyFrom() の実装が重要な場合は、それらも提供できます。
いくつかの追加情報:
- Class Image のネイティブ カラー スペースは RGB、32 ビット浮動小数点深度、値は [0,1] です。
- 現在、copyTo() は画像を上下逆にコピーしますが、それ以外はそのままです。これは無関係だと思っていましたが、役に立つかもしれません...