He estado tratando de utilizar la implementación de OpenCV del método de corte simultáneo a través de los enlaces de Python. He intentado usar la versión en cv y cv2, pero tengo problemas para encontrar los parámetros correctos que debo usar para que el método se ejecute correctamente. He intentado varias permutaciones de los parámetros y nada parece funcionar (básicamente, cada ejemplo que he visto en Github). Aquí hay un par de ejemplos que han tratado de seguir:Enlaces de OpenCV Python para el algoritmo de GrabCut
Y aquí está la documentación del método y un conocido informe de error:
Puedo obtener el código para ejecutarnos El ejemplo siguiente, pero devuelve una máscara de imagen en blanco (todo negro).
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)
Estoy usando SimpleCV para cargar las imágenes. El tipo de máscara y el tipo de retorno de img.getBitmap() son:
iplimage(nChannels=1 width=730 height=530 widthStep=732)
iplimage(nChannels=3 width=730 height=530 widthStep=2192)
Si alguien tiene un ejemplo práctico de este código me gustaría verlo. Por lo que vale, me estoy ejecutando en OSX Snow Leopard, y mi versión de OpenCV se instaló desde el repositorio SVN (desde hace algunas semanas). Como referencia, mi imagen de entrada es la siguiente:
He intentado cambiar los valores enum de la máscara de resultado por algo más visible. No son los valores de retorno los que son el problema. Esto devuelve una imagen completamente negra. Voy a probar un par de valores más.
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")
Ejemplo movido al hilo principal. – kscottz