我一直在嘗試通過Python綁定使用抓取方法的OpenCV實現。我曾嘗試在cv和cv2中使用該版本,但我無法找到正確的參數來使該方法正確運行。我嘗試了幾個參數的排列,似乎沒有任何工作(基本上我在Github上看到過的每個示例)。這裏有幾個例子我試圖遵循:GrabCut算法的OpenCV Python綁定
這裏是方法的文檔和已知的bug報告:
我可以得到執行我們的代碼下面的例子,但它返回一個空白(全黑)圖像掩碼。
img = Image("pills.png")
mask = img.getEmpty(1)
bgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1)
fgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1)
for i in range(0, 13*5):
cv.SetReal2D(fgModel, 0, i, 0)
cv.SetReal2D(bgModel, 0, i, 0)
rect = (150,70,170,220)
tmp1 = np.zeros((1, 13 * 5))
tmp2 = np.zeros((1, 13 * 5))
cv.GrabCut(img.getBitmap(),mask,rect,tmp1,tmp2,5,cv.GC_INIT_WITH_RECT)
我正在使用SimpleCV加載圖像。 img.getBitmap()中的掩碼類型和返回類型爲:
iplimage(nChannels=1 width=730 height=530 widthStep=732)
iplimage(nChannels=3 width=730 height=530 widthStep=2192)
如果有人有此代碼的工作示例,我很樂意看到它。我在OSX Snow Leopard上運行它的價值是什麼,而我的OpenCV版本是從SVN存儲庫安裝的(截至幾周前)。作爲參考我的輸入圖像是這樣的:
我試着改變結果掩碼枚舉值更明顯的東西。這不是問題的返回值。這會返回一個完全黑色的圖像。我會嘗試更多的價值觀。
img = Image("pills.png")
mask = img.getEmpty(1)
bgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1)
fgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1)
for i in range(0, 13*5):
cv.SetReal2D(fgModel, 0, i, 0)
cv.SetReal2D(bgModel, 0, i, 0)
rect = (150,70,170,220)
tmp1 = np.zeros((1, 13 * 5))
tmp2 = np.zeros((1, 13 * 5))
cv.GrabCut(img.getBitmap(), mask, rect, tmp1, tmp2, 5, cv.GC_INIT_WITH_MASK)
mask[mask == cv.GC_BGD] = 0
mask[mask == cv.GC_PR_BGD] = 0
mask[mask == cv.GC_FGD] = 255
mask[mask == cv.GC_PR_FGD] = 255
result = Image(mask)
result.show()
result.save("result.png")
將示例移動到主線程。 – kscottz 2012-02-28 17:38:38