将floodfill open cv从c ++转换为python

时间:2017-10-09 08:15:49

标签: python c++ opencv

我正在将一个opencv代码从c ++转换为python,并在靠近洪水填充的地方停留。

c ++实现是

Mat floodFilled = cv::Mat::zeros(dilateGrad.rows+2, dilateGrad.cols+2, CV_8U);
floodFill(dilateGrad, floodFilled, cv::Point(0, 0), 0, 0, cv::Scalar(), cv::Scalar(), 4 + (255 << 8) + cv::FLOODFILL_MASK_ONLY);
floodFilled = cv::Scalar::all(255) - floodFilled;
Mat temp;
floodFilled(Rect(1, 1, dilateGrad.cols-2, dilateGrad.rows-2)).copyTo(temp);

我的python实现

h, w = dilateGrad.shape[:2]
floodFilled =np.zeros((h+2,w+2),dtype = np.uint8)
cv2.floodFill(dilateGrad,floodFilled,(0,0),255,cv2.FLOODFILL_MASK_ONLY)
floodFilled =  np.all(255) - floodFilled
floodFilled = cv2.rectangle(dilateGrad,1,1,(h-2,w-2),floodFilled,cv2.CV_8U)

我是python中opencv的新手,感谢任何人的帮助。

1 个答案:

答案 0 :(得分:1)

C ++代码最后一行中的Rect运算符用于指定floodFilled Mat的ROI,并将该ROI复制到Mat temp

在python代码中可以实现类似的行为,如下所示:

temp = floodFilled[1:h-2, 1:w-2].copy()

对于Scalar运算符,您必须使用python的元组代替Scalar。例如Scalar::all(255)将等于tuple([255] * NumberOfChannels)。对于您目前的情况,NumberOfChannels 1 ,因此它相当于 255

代替空Scalar(),只需将None作为参数传递。

您的最终代码可能如下所示:

h, w = dilateGrad.shape[:2]
floodFilled = np.zeros((h+2,w+2), dtype = np.uint8)
cv2.floodFill(dilateGrad, floodFilled, (0,0), 255, None, None, cv2.FLOODFILL_MASK_ONLY)
floodFilled =  (255) - floodFilled
temp = floodFilled[1:h-2, 1:w-2].copy()

仅供参考:

cv2.rectangle功能的目的是在图像上绘制一个矩形。

np.all评估作为参数传递给它的二进制条件列表,并且仅当列表中所有条件评估为True时才返回True。