Привязки OpenCV Python для алгоритма GrabCut

Я пытался использовать OpenCV-реализацию метода grab cut через привязки Python. Я пробовал использовать эту версию как в cv, так и в cv2, но у меня возникли проблемы с поиском правильных параметров, которые нужно использовать для правильной работы метода. Я пробовал несколько перестановок параметров, но ничего не работает (в основном каждый пример, который я видел на Github). Вот пара примеров, которым я пытался следовать:

Пример 1

Пример 2

А вот документация по методу и отчет об известной ошибке:

Документация

Известная ошибка Grabcut

I может получить код для выполнения, используя приведенный ниже пример, но он возвращает пустую (полностью черную) маску изображения.

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

7
задан kscottz 28 February 2012 в 17:40
поделиться