2011-09-28 35 views
18

Estoy tratando de convertir una matriz 2D Numpy, que representa una imagen en blanco y negro, en una matriz OpenCV de 3 canales (es decir, una imagen RGB).Convertir Numpy Array a OpenCV Array

Basado en code samples y the docs Estoy tratando de hacerlo a través de Python como:

import numpy as np, cv 
vis = np.zeros((384, 836), np.uint32) 
h,w = vis.shape 
vis2 = cv.CreateMat(h, w, cv.CV_32FC3) 
cv.CvtColor(vis, vis2, cv.CV_GRAY2BGR) 

Sin embargo, la llamada a CvtColor() está lanzando la siguiente excepción de nivel CPP:

OpenCV Error: Image step is wrong() in cvSetData, file /build/buildd/opencv-2.1.0/src/cxcore/cxarray.cpp, line 902 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /build/buildd/opencv-2.1.0/src/cxcore/cxarray.cpp:902: error: (-13) in function cvSetData 

Aborted 

¿Qué estoy haciendo mal?

+0

De los documentos para 'CvtColor'" src: la imagen de origen, sin signo de 8 bits, sin signo de 16 bits (CV_16UC ...) o coma flotante de precisión simple ". Noté que tu matriz numpy es 'np.uint32'. Esto puede explicar 'OpenCV Error: Image step is wrong() en cvSetData'. Noto que las muestras de código usan un tipo de datos diferente: ver 'vis = np.zeros ((max (h1, h2), w1 + w2), np.uint8)'. –

Respuesta

19

El código puede ser fijado de la siguiente manera:

import numpy as np, cv 
vis = np.zeros((384, 836), np.float32) 
h,w = vis.shape 
vis2 = cv.CreateMat(h, w, cv.CV_32FC3) 
vis0 = cv.fromarray(vis) 
cv.CvtColor(vis0, vis2, cv.CV_GRAY2BGR) 

Breve explicación:

  1. np.uint32 tipo de datos no es compatible con OpenCV (soporta uint8, int8, uint16, int16, int32, float32 , float64)
  2. cv.CvtColor no se puede manejar matrices numpy s o ambos argumentos deben convertirse a tipo OpenCV. cv.fromarray haga esta conversión.
  3. Ambos argumentos de cv.CvtColor deben tener la misma profundidad. Así que cambié el tipo de fuente a flotador de 32 bits para que coincida con la destinación.

También se recomienda que utilice la versión más reciente de OpenCV API Python, ya que utiliza matrices numpy como el tipo de datos primarios:

import numpy as np, cv2 
vis = np.zeros((384, 836), np.float32) 
vis2 = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR) 
+0

Gracias por su ayuda. Eso fue todo exactamente. – Cerin

-1

Esto es lo que funcionó para mí ...

import cv2 
import numpy as np 

#Created an image (really an ndarray) with three channels 
new_image = np.ndarray((3, num_rows, num_cols), dtype=int) 

#Did manipulations for my project where my array values went way over 255 
#Eventually returned numbers to between 0 and 255 

#Converted the datatype to np.uint8 
new_image = new_image.astype(np.uint8) 

#Separated the channels in my new image 
new_image_red, new_image_green, new_image_blue = new_image 

#Stacked the channels 
new_rgb = np.dstack([new_image_red, new_image_green, new_image_blue]) 

#Displayed the image 
cv2.imshow("WindowNameHere", new_rgbrgb) 
cv2.waitKey(0)