2017-10-09 121 views
2

我将一个opencv代码从C++转换为python,并在填充附近的某个地方进行了搜索。从C++转换floodfill打开cv到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的,任何人的帮助表示赞赏。

+0

这是什么问题? – GPPK

+0

@GPPK我无法解码floodfill的最后部分,即为floodfill创建标量值以及如何创建矩形 –

回答

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为,所以它将相当于。

代替空的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。

+0

感谢您的信息,但是如何在python中使用C++的标量函数。 而我无法正确获得我的cv2.floodfill,因为我得到一个完整的黑色图像。 –

+0

@faizanbaig ...请检查更新的答案。 – sgarizvi

+0

谢谢你正确解释 –