web-dev-qa-db-fra.com

Conversion d'un tableau Numpy en tableau OpenCV

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?

23
Cerin

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:

  1. 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)
  2. 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.
  3. Les deux arguments de 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)
29
Andrey Kamaev

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)
2
Mel