2

我需要将 OpenCV 函数应用dilate()erode()一个Mat实际上是更大图像中的 ROI 的对象。Mat roiImg 通过在原始图像中为 ROI 创建标题来生成img

Mat img = imread(...);
Mat roiImg = img (Rect(...));

这是 的参数列表erode()

void erode(InputArray src, OutputArray dst, InputArray kernel, Pointanchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

问题是,由于我对函数 erode/dilate 的输入图像是 ROI 的标头,因此选择BORDER_CONSTANT边界类型以及边界值等于morphologyDefaultBorderValue()似乎没有任何影响,并且边界值是从原始获得的图片。

然后我在文档中找到了这个copyMakeBorder()

当源图像是更大图像的一部分(ROI)时,该函数将尝试使用 ROI 之外的像素来形成边框。要禁用此功能并始终进行外推,就好像src不是 ROI,请使用borderType | BORDER_ISOLATED.

但是,cv::borderInterpolate()这是从函数内部调用的erode()函数,不接受BORDER_ISOLATED作为有效的边框类型!

现在,要解决这个问题,我必须克隆roiImg,然后调用erode(). 但理想情况下,我不想要克隆的开销。有没有办法解决这个问题?

4

1 回答 1

1

This appears to be a known bug in OpenCV. Until it's fixed, cloning might be the best workaround.

于 2013-08-23T19:18:08.760 回答