2012-02-27 96 views
7

我一直在嘗試通過Python綁定使用抓取方法的OpenCV實現。我曾嘗試在cv和cv2中使用該版本,但我無法找到正確的參數來使該方法正確運行。我嘗試了幾個參數的排列,似乎沒有任何工作(基本上我在Github上看到過的每個示例)。這裏有幾個例子我試圖遵循:GrabCut算法的OpenCV Python綁定

Example 1

Example 2

這裏是方法的文檔和已知的bug報告:

Documentation

Known Grabcut 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存儲庫安裝的(截至幾周前)。作爲參考我的輸入圖像是這樣的: Input Image

我試着改變結果掩碼枚舉值更明顯的東西。這不是問題的返回值。這會返回一個完全黑色的圖像。我會嘗試更多的價值觀。

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") 
+0

將示例移動到主線程。 – kscottz 2012-02-28 17:38:38

回答

5

吉,這個版本的代碼似乎爲我工作。

import numpy as np 
import matplotlib.pyplot as plt 
import cv2 


filename = "pills.png" 
im = cv2.imread(filename) 

h,w = im.shape[:2] 

mask = np.zeros((h,w),dtype='uint8') 
rect = (150,70,170,220) 
tmp1 = np.zeros((1, 13 * 5)) 
tmp2 = np.zeros((1, 13 * 5)) 

cv2.grabCut(im,mask,rect,tmp1,tmp2,10,mode=cv2.GC_INIT_WITH_RECT) 

plt.figure() 
plt.imshow(mask) 
plt.colorbar() 
plt.show() 

產生一個這樣的圖,標籤爲0,2和3。 enter image description here

1

你的面具充滿following values

  • GC_BGD定義了一個明顯的背景像素。
  • GC_FGD定義了一個明顯的前景(對象)像素。
  • GC_PR_BGD定義了一個可能的背景像素。
  • GC_PR_FGD定義了一個可能的前景像素。

這是一個enum的一部分:

enum { GC_BGD = 0, // background 
     GC_FGD = 1, // foreground 
     GC_PR_BGD = 2, // most probably background 
     GC_PR_FGD = 3 // most probably foreground 
    }; 

它轉換爲顏色:全黑的,很黑,暗黑色和黑色。我想你會發現,如果你添加以下代碼(從example 1取出並略作修改)你的面具將看起來更好:

mask[mask == cv.GC_BGD] = 0 //certain background is black 
mask[mask == cv.GC_PR_BGD] = 63 //possible background is dark grey 
mask[mask == cv.GC_FGD] = 255 //foreground is white 
mask[mask == cv.GC_PR_FGD] = 192 //possible foreground is light grey 
+1

所以我注意到這一點,當我試圖讓這個工作。我剛剛運行了以下代碼片段: – kscottz 2012-02-28 17:36:51

+0

請參閱上面我添加的代碼片段,這也不起作用。謝謝您的幫助。如果你可以提供你使用的示例圖片,我將不勝感激。 – kscottz 2012-02-28 17:42:16

+0

如果您在下面的Jan Erik的評論中嘗試下面的代碼,會發生什麼? – 2012-02-29 15:28:30