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
I tu jest dokumentacja tejże metody i znany raport o błędzie:
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:
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")
Przeniesiono przykład do głównego wątku. – kscottz