cvtcolor - image processing python book
Convirtiendo Numpy Array en OpenCV Array (2)
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)
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).
Basándome en los ejemplos de código y los documentos , intento 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 () arroja 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?
Su código se puede arreglar 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:
-
np.uint32
tipo de datosnp.uint32
no es compatible con OpenCV (admiteuint8
,int8
,uint16
,int16
,int32
,float32
,float64
) -
cv.CvtColor
no puede manejar matrices numpy por lo que ambos argumentos deben convertirse a tipo OpenCV.cv.fromarray
hacer esta conversión. - 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 te recomiendo que uses la versión más nueva de OpenCV python API porque usa matrices numpy como tipo de datos primario:
import numpy as np, cv2
vis = np.zeros((384, 836), np.float32)
vis2 = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR)