2011-09-28 78 views
18

我試圖將2D numpy的數組,表示黑和白圖像,成一個3通道的OpenCV陣列(即RGB圖像)。轉換numpy的陣列到陣列的OpenCV

基於code samplesthe docs我試圖通過Python要做到這一點,如:

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) 

然而,調用CvtColor()拋出以下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 

我在做什麼錯?

+0

從「CvtColor」的文檔src - 源圖像,8位無符號,16位無符號(CV_16UC ...)或單精度浮點數。我注意到你的numpy數組是'np.uint32'。這可能解釋'OpenCV錯誤:圖像步驟錯誤()在cvSetData'中。我注意到代碼示例使用了不同的數據類型:參見'vis = np.zeros((max(h1,h2),w1 + w2),np.uint8)'。 –

回答

19

您的代碼可以是固定的,如下所示:

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) 

簡短說明:

  1. np.uint32數據類型不受OpenCV的支持(它支持uint8int8uint16int16int32float32float64
  2. cv.CvtColor不能處理numpy的陣列小號o兩個參數都必須轉換爲OpenCV類型。 cv.fromarray做這個轉換。
  3. cv.CvtColor兩個參數必須具有相同的深度。所以我已經將源類型更改爲32位浮點數以匹配ddestination。

此外,我建議你使用的OpenCV的Python API的新版本,因爲它使用numpy的數組作爲主要數據類型:

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

感謝您的幫助。就是這樣。 – Cerin

-1

這是對我工作......

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)