2012-03-28 18 views
10

Con OpenCV 2, IPython ahora usa matrices NumPy de forma predeterminada.Convertir matriz NumPy a cvMat cv2

cvimage = cv2.imread("image.png") #using OpenCV 2 
type(cvimage) 
Out: numpy.ndarray #dtype is uint8 

pltimage = plt.imread("image.png") #using Matplotlib 
type(pltimage) 
Out: numpy.ndarray #dtype is float 

plt.imshow(cvimage) # works great 

cv2.imshow(cvimage) 
TypeError: Required argument 'mat' (pos 2) not found 

Desde cv2 utiliza arrays NumPy de forma predeterminada, ya no hay ninguna cv :: constructor Mat y NumPy no tiene funciones para convertir a una matriz cv::Mat.

¿Alguna idea?

+1

Sí, esto ya se ha respondido; en realidad, no le falta el segundo argumento, sino el primero. Sin embargo, vine aquí con otro problema: no todos los 'numpy.ndarray' de tipo' uint8' se pueden mostrar. Hice un corte, para obtener un solo canal de una imagen, como 'rojo = marco [:,:, 0]', y luego obtuve una excepción en 'imshow'. Sospecho que es debido a la escasez. 'red = frame [:,:, 0] .copy()' solucionó eso. –

Respuesta

14

La función tiene el siguiente docstring: imshow(winname, mat) -> None. Puede ver la cadena de documentación escribiendo cv2.imshow.__doc__ en el intérprete.

Probar cv2.imshow('Image', cvimage).

+2

Cuando hago 'cvimage = cv2.imread ('image.png')' seguido de 'cv2.imshow ('Image', cvimage)', no se devuelve ningún error y se muestra la imagen. – zarthur

+0

Sin importar numpy, el tipo devuelto es 'numpy.ndarray'. – zarthur

+1

falta un argumento requerido – Neon22

3

Mat objeto era necesario porque C/C++ carecía de una implementación estándar/nativa de las matrices.

Sin embargo, numpy 's array es un reemplazo perfecto para esa funcionalidad. Por lo tanto, el módulo cv2 acepta numpy.array s donde se indique una matriz en los documentos.

14

La pregunta técnicamente pregunta cómo convertir una matriz NumPy (análoga a una matriz CV2) en un objeto Mat (CV). Para cualquiera que esté interesado, esto se puede hacer por:

mat_array = cv.fromarray(numpy_array) 

donde mat_array es un objeto de la estera, y numpy_array es una matriz NumPy o imagen. Sugiero que se mantengan alejados de las estructuras CV más antiguas cuando sea posible. Las matrices Numpy ofrecen un rendimiento mucho mejor que las implementaciones en Python nativo

+9

Esto es para cv not cv2 –

+0

¿Cómo deberíamos hacer esto en C++ y para cv2? –

Cuestiones relacionadas