imagen cvtcolor contours color_bgr2gray color book binarizar python numpy opencv image-processing

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:

  1. np.uint32 tipo de datos np.uint32 no es compatible con OpenCV (admite uint8 , int8 , uint16 , int16 , int32 , float32 , float64 )
  2. cv.CvtColor no puede manejar matrices numpy por lo que ambos argumentos deben convertirse a tipo OpenCV. cv.fromarray hacer 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 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)