我试图在将图像转换为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);
在第一次侵蚀时,我收到以下错误,如屏幕截图所示。
我使用以下图像作为输入
我在这里做错了什么?
答案 0 :(得分:3)
当您致电cvErode
和cvDilate
时,可能会显示错误。您正在混合使用C和C ++接口。所以,例如,在
cvErode(&erodedImg, &InterMediateImg, element, 1);
erodedImg
和InterMediateImg
类型为cv::Mat
时,类型为cvMat
。 cvDilate
也是如此。
您可以使用新界面:
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::Mat
转换为cvMat
(link to cheatsheet):
CvMat cvmat = img; // convert cv::Mat -> CvMat
另请注意,当您调用这些函数时,目标矩阵不为空,并且可能与源矩阵的类型不同,因此如果我没有弄错的话,您也有可能在错误中运行。< / p>