2017-10-09 119 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

謝謝你正確解釋 –