C++ Opencv泛光填充:如何将图像坐标转换为遮罩坐标?

C++ Opencv泛光填充:如何将图像坐标转换为遮罩坐标?,c++,opencv,image-processing,flood-fill,C++,Opencv,Image Processing,Flood Fill,我在android应用程序上使用了floodFill。Opencv泛光填充功能更改遮罩输入图像 public static int floodFill(Mat image, Mat mask, Point seedPoint, Scalar newVal, Rect rect, Scalar loDiff, Scalar upDiff, int flags) 我从中阅读了这个函数的用

我在android应用程序上使用了
floodFill
。Opencv泛光填充功能更改遮罩输入图像

public static int floodFill(Mat image,
        Mat mask,
        Point seedPoint,
        Scalar newVal,
        Rect rect,
        Scalar loDiff,
        Scalar upDiff,
        int flags)
我从中阅读了这个函数的用法。文件上说

操作掩码应为单通道8位图像,比图像宽2像素,高2像素

注意:由于遮罩大于填充图像,图像中的像素(x,y)对应于遮罩中的像素(x+1,y+1)


但我认为,如果我想访问(x,y),我就使用(x+2,y+2)。我错了吗?

你应该相信这些文档!(嗯,大多数时候…:-)

遮罩比输入图像宽2个像素,高2个像素,但在图像的顶部/左侧使用一条像素条纹,在图像的底部/右侧使用另一条

正如您所说的,在泛光填充期间,所有输入图像坐标通过求和(1,1)转换为遮罩坐标

例如,当到达位于坐标
x=0,y=y0
处的图像左边缘的任何点时,算法将在掩码中检查以坐标
x=1,y=y0+1
为中心的8个点,其中包括点
x=0,y=y0+1
(紧靠左侧)。如果不求和1,则将退出图像边界

当到达位于坐标
x=inputImage.cols-1,y=y0
处的图像右边缘时,算法将在遮罩中检查以坐标
x=inputImage.cols,y=y0+1
为中心的8个点,其中包括点
x=inputImage.cols+1,y=y0+1
(紧靠右侧)。如果遮罩不比原始图像宽2像素,则会退出图像边界

这就是为什么需要一个比输入图像宽2像素的遮罩图像,同时求和(1,1)以从图像转换到遮罩坐标

当然,所有这些注意事项对于
y
坐标都是有效的,以解释为什么遮罩必须比输入图像高2像素

public static int floodFill(Mat image,
        Mat mask,
        Point seedPoint,
        Scalar newVal,
        Rect rect,
        Scalar loDiff,
        Scalar upDiff,
        int flags)

注意:如果您使用的是4邻域而不是8邻域,注意事项是相同的。

@Holazolli如果您对我的答案感到满意,请检查。