2011-12-11 18 views
5

Si bien, en general, los nuevos enlaces de Python para OpenCV (CV2) son una belleza, no parecen "máscaras" que están funcionando correctamente - a menos que realmente conseguir algo mal:Máscaras en python opencv cv2 no funcionan?

Por ejemplo "cv2.add" sigue funcionando adecuadamente sin una máscara:

import cv2 
a = ones((2,2,3), dtype=uint8) 
cv2.add(a,a) 

da correctamente

array([[[2, 2, 2], 
     [2, 2, 2]], 

     [[2, 2, 2], 
     [2, 2, 2]]], dtype=uint8) 

Pero cuando se agrega una máscara (y una serie cabo "b" - que es requerido por por alguna razón no se le asigna tampoco) se obtiene un resultado RANDOM, es decir, el resultado cambia cuando ejecute el comando varias veces

myMask = zeros(a.shape[0:2], dtype = uint8) 
mask[1,1] = 255 
b = zeros(a.shape) 
cv2.add(a,a,b,myMask) 
cv2.add(a,a,b,myMask) 

da en mi máquina (Win7, de 32 bits, Python 2.7, OpenCV 2.3.1)

In [34]: cv2.add(a,a,b,myMask) 
Out[34]: 
array([[[ 26, 0, 143], 
     [ 5, 216, 245]], 

     [[156, 5, 104], 
     [ 2, 2, 2]]], dtype=uint8) 

In [35]: cv2.add(a,a,b,myMask) 
Out[35]: 
array([[[35, 0, 0], 
     [ 0, 3, 0]], 

     [[ 0, 0, 3], 
     [ 2, 2, 2]]], dtype=uint8) 

... y algo nuevo en la siguiente prueba. Ahora bien, me sale algo muy mal, o hay un problema grave con los enlaces cv2.

¿Alguna sugerencia?

+0

vea como un problema cv2, ¡Prefiero reportar el problema directamente en su sitio web en lugar de publicar el error en stackoverflow! :) – tito

+0

Hecho - gracias por la pista, no me di cuenta de que puede publicar errores (es decir, emitir "tickets") allí. – thomash

Respuesta

0

¿por qué no usar la expresión enmascarada numpy (inplace)?

b = array(a, copy=True) 
b[mask] += a 

máscara es una matriz booleana, analógica en OpenCV (cv2.add), donde se cambia un valor cuando máscara = 0

PD: sin embargo, el código funciona bien en mi máquina (Win7 64, Python 2.6 (32 bits), OpenCV 2.3.0) aunque

5

Es una pregunta interesante. Estoy viendo el mismo problema Publiqué un error y obtuve una respuesta. http://code.opencv.org/issues/1748

La solución es simple. La matriz dst no está definida en la creación y la operación solo cambia los píxeles de la matriz de destino p, cuya máscara (p)! = 0.

Así que el único mecanismo que funciona es premake dst before addition. Es decir

dst = np.zeros(...) 
dst = cv2.add(a, a, dst=dst, mask=mask) 

La próxima versión se borrarán los recién imágenes en operaciones tales como cv2.add, cv2.subtract, cv2.bitwise_and/o/XOR creado - por lo que funciona sin problema.

mi código es el siguiente:

import cv2 
import numpy as np 
import time 

a = np.ones((2,2,3), dtype=np.uint8) 

print "simple add" 
t = time.time() 
for i in range(10000): 
    b = cv2.add(a,a) 
print "%5.4f seconds" % (time.time()-t) 
print b 

print "\nnumpy add" 
t = time.time() 
for i in range(10000): 
    b = a+a 
print "%5.4f seconds" % (time.time()-t) 
print b 

# make mask same dimensions but 1 byte deep(not three) 
mask = np.zeros(a.shape[:-1], dtype=np.uint8) 
mask[1,1] = 255 

print "\nmask", mask.shape 
print mask 

print "\nmasked add - uninitialised" 
t = time.time() 
for i in range(10000): 
    b = cv2.add(a,a,mask=mask) 
print "%5.4f seconds" % (time.time()-t) 
print b 
print "uninitialised entries are unmodified - so random.\n Inconsistent when run more than once." 
print "same calc a second time..." 
b = cv2.add(a,a,mask=mask) 
print b 

print "\nmasked add - using preinitialised dst" 
t = time.time() 
b = a.copy() 
for i in range(10000): 
    b = cv2.add(a,a,b,mask=mask) 
print "%5.4f seconds" % (time.time()-t) 
print b 
print "Consistent when run more than once." 
print "same calc a second time..." 
b = a.copy() 
b = cv2.add(a,a,b,mask=mask) 
print b 

FYI: los tiempos (10k repeticiones):

cv2.add - no mask   0.0120 seconds 
cv2.add - with mask   0.0160 seconds 
np.add      0.0190 seconds 
cv2.add - uninitialised mask 0.0220 seconds 

FYI: enviar errores siguiendo las instrucciones aquí: http://code.opencv.org/projects/OpenCV/wiki/WikiStart

+0

editado y actualizado con respuesta de informe de error. – Neon22

Cuestiones relacionadas