Argumentos a cv2 :: imshow

Edición: el título original “convertir la matriz numpy a cvmat” fue un error: el mensaje de error de OpenCV no es muy útil y no estoy leyendo la documentación.

Con OpenCV 2, IPython ahora usa las matrices NumPy de forma predeterminada.

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 

Como cv2 usa matrices NumPy de forma predeterminada, ya no hay ningún constructor cv :: Mat y NumPy no tiene funciones para convertir a una matriz cv::Mat .

¿Algunas ideas?

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

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

tl; dr: En la pregunta original, faltaba el primer argumento de “nombre de ventana”. “imshow” toma dos parámetros y solo se suministró uno.

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

 mat_array = cv.fromarray(numpy_array) 

donde mat_array es un objeto Mat, y numpy_array es una matriz o imagen NumPy. Yo sugeriría que se mantenga alejado de las estructuras de CV más antiguas cuando sea posible. Las matrices numpy ofrecen un rendimiento mucho mejor que las implementaciones en Python nativo

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

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