J'essaie de convertir un tableau Numpy 2D, représentant une image en noir et blanc, en un tableau OpenCV à 3 canaux (c'est-à-dire une image RVB).
Basé sur exemples de code et les documents j'essaie de le faire via Python comme:
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)
Cependant, l'appel à CvtColor () lève l'exception de niveau cpp suivante:
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'est-ce que je fais mal?
Votre code peut être corrigé comme suit:
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)
Brève explication:
np.uint32
le type de données n'est pas pris en charge par OpenCV (il prend en charge uint8
, int8
, uint16
, int16
, int32
, float32
, float64
)cv.CvtColor
ne peut pas gérer les tableaux numpy donc les deux arguments doivent être convertis en type OpenCV. cv.fromarray
effectuez cette conversion.cv.CvtColor
doit avoir la même profondeur. J'ai donc changé le type de source en flottant 32 bits pour correspondre à la destination.Je vous recommande également d'utiliser une version plus récente d'OpenCV python car elle utilise des tableaux numpy comme type de données principal:
import numpy as np, cv2
vis = np.zeros((384, 836), np.float32)
vis2 = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR)
C'est ce qui a fonctionné pour moi...
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)