2012-02-27 15 views
7

Próbowałem użyć implementacji OpenCV metody "chwyć" za pomocą powiązań Python. Próbowałem używać wersji zarówno w CV i cv2, ale mam problem ze znalezieniem poprawnych parametrów do użycia, aby uzyskać prawidłową metodę. Próbowałem kilku permutacji parametrów i nic nie działa (w zasadzie każdy przykład widziałem na Githubie). Oto kilka przykładów próbowałem podążać:Wiązania Python OpenCV dla algorytmu GrabCut

Example 1

Example 2

I tu jest dokumentacja tejże metody i znany raport o błędzie:

Documentation

Known Grabcut Bug

Mogę uzyskać kod do wykonania nas przykład poniżej, ale zwraca pustą (całą czarną) maskę obrazu.

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) 

Używam SimpleCV do ładowania obrazów. Typ maski i typ zwracany z img.getBitmap() są:

iplimage(nChannels=1 width=730 height=530 widthStep=732) 
iplimage(nChannels=3 width=730 height=530 widthStep=2192) 

Jeśli ktoś ma działający przykład tego kodu chciałbym go zobaczyć. O ile warto, uruchamiam system OSX Snow Leopard, a moją wersję OpenCV zainstalowałem z repozytorium SVN (kilka tygodni temu). Dla odniesienia mój obraz wejściowy jest następujący: Input Image

Próbowałem zmienić wartość wyliczenia maski wyników na coś bardziej widocznego. To nie są wartości zwracane, które są problemem. Zwraca to całkowicie czarny obraz. Spróbuję jeszcze kilka wartości.

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

Przeniesiono przykład do głównego wątku. – kscottz

Odpowiedz

5

Kat, ta wersja kodu wydaje się działać dla mnie.

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() 

Tworzy taką postać z etykietami 0,2 i 3. enter image description here

1

maskę wypełniona jest following values:

  • GC_BGD definiuje oczywistym tła pikseli.
  • GC_FGD definiuje oczywisty piksel pierwszego planu (obiektu).
  • GC_PR_BGD definiuje możliwy piksel tła.
  • GC_PR_FGD definiuje możliwy piksel pierwszego planu.

które są częścią enum:

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

co przekłada się kolorami: całkowicie czarne, bardzo czarny, ciemny czarny i czarny. Myślę, że przekonasz się, że jeśli dodać następujący kod (wzięte z example 1 i lekko zmodyfikowane) maska ​​będzie wyglądać ładniej:

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

Zauważyłem to, gdy próbowałem uruchomić to. Właśnie uruchomiłem następujący fragment: – kscottz

+0

Zobacz fragment, który dodałem powyżej, to też nie działa. Dzięki za pomoc. Gdybyś mógł przedstawić przykładowy obraz, którego użyłbyś, byłbym wdzięczny. – kscottz

+0

Co stanie się, jeśli spróbujesz wpisać kod w komentarzu Jana Erika poniżej? –