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);

在第一次侵蚀时,我收到以下错误,如屏幕截图所示。

错误图像

我已使用以下图像作为输入

索引.jpg

我在这里做错了什么?

4

1 回答 1

2

当您调用cvErodeand时可能会出现该错误cvDilate。您正在混合 C 和 C++ 接口。所以,例如,在

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

erodedImg并且当它们应该是InterMediateImgtype时是 type 。同样的事情。cv::MatcvMatcvDilate

您可以使用新界面:

简历::侵蚀

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())

简历::扩张

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


另请注意,当您调用这些函数时,目标矩阵不是空的,并且可能与源矩阵的类型不同,因此如果我没记错的话,您也有可能在此处运行错误。


OpenCV 2.4.2 中不错的腐蚀和膨胀教程

于 2012-09-19T19:20:56.137 回答