0

画像をYCrCb画像空間に変換した後、JPEG画像の侵食を実行しようとしています。次のコードを使用する

 YCrCbMin.val[0] = 0;
 YCrCbMin.val[1] = 131;
 YCrCbMin.val[2] = 80;

 YCrCbMax.val[0] = 255;
 YCrCbMax.val[1] = 185;
 YCrCbMax.val[2] = 135;

 imshow("img",Img);// Img is the JPEG image I load off the disk. 
 waitKey(0);

 Mat YCrCbImg;
 cvtColor(Img, YCrCbImg, CV_BGR2YCrCb);

 Mat erodedImg;
 inRange(YCrCbImg, YCrCbMin, YCrCbMax, erodedImg);

 Mat InterMediateImg     = YCrCbImg;
 IplConvKernel* element  = new IplConvKernel();

 element->nCols      = 12;   element->nRows      = 12;   element->anchorX    = 6;    element->anchorY    = 6;

  cvErode(&erodedImg, &InterMediateImg, element, 1);
  element->nCols      = 6;    element->nRows      = 6;    element->anchorX    = 3;    element->anchorY    = 3;
  cvDilate(&InterMediateImg, &erodedImg, element, 2);

最初の侵食では、スクリーンショットに示すように、次のエラーが発生します。

エラー画像

次の画像を入力として使用しました

index.jpg

私はここで何が間違っているのですか?

4

1 に答える 1

2

cvErodeとを呼び出すと、エラーが表示される可能性がありますcvDilate。CインターフェイスとC++インターフェイスを混在させています。だから、例えば、

cvErode(&erodedImg, &InterMediateImg, element, 1);

erodedImgInterMediateImgは、タイプcv::Matである必要があるときにタイプcvMatです。についても同じですcvDilate

新しいインターフェースを使用することができます:

cv :: erode

void erode(const Mat& src, Mat& dst, const Mat& element, Point anchor=Point(-1, -1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue())

cv :: dilate

void dilate(const Mat& src, Mat& dst, const Mat& element, Point anchor=Point(-1, -1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue())

またはから(チートシートへのリンク)に変換cv::MatcvMat ます

CvMat cvmat = img; // convert cv::Mat -> CvMat


また、これらの関数を呼び出すとき、宛先マトリックスは空ではなく、おそらくソースマトリックスと同じタイプではないため、私が間違っていなければ、そこでもエラーが発生する可能性があることに注意してください。


OpenCV2.4.2の優れた侵食と拡張のチュートリアル

于 2012-09-19T19:20:56.137 に答える