2011-09-28 49 views
18

Tôi đang cố chuyển đổi một mảng 2D Numpy, đại diện cho một hình ảnh đen trắng, thành một mảng OpenCV 3 kênh (tức là hình ảnh RGB).Chuyển mảng Numpy sang OpenCV Array

Dựa trên code samplesthe docs Tôi đang cố gắng để làm điều này qua Python như:

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) 

Tuy nhiên, các cuộc gọi đến CvtColor() là ném ngoại lệ cpp cấp sau:

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 

Tôi đang làm gì sai?

+0

Từ tài liệu cho 'CvtColor'" src - Hình ảnh nguồn, không dấu 8 bit, không dấu 16 bit (CV_16UC ...) hoặc điểm nổi chính xác đơn ". Tôi nhận thấy rằng mảng numpy của bạn là 'np.uint32'. Điều này có thể giải thích 'Lỗi OpenCV: Bước hình ảnh sai() trong cvSetData'. Tôi nhận thấy các mẫu mã sử dụng một kiểu dữ liệu khác: xem 'vis = np.zeros ((tối đa (h1, h2), w1 + w2), np.uint8)'. –

Trả lời

19

Mã của bạn có thể được cố định như sau:

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) 

lời giải thích ngắn gọn:

  1. np.uint32 kiểu dữ liệu không được hỗ trợ bởi OpenCV (nó hỗ trợ uint8, int8, uint16, int16, int32, float32 , float64)
  2. cv.CvtColor không thể xử lý các mảng sumpy s o cả hai đối số phải được chuyển đổi sang loại OpenCV. cv.fromarray thực hiện chuyển đổi này.
  3. Cả hai đối số của cv.CvtColor phải có cùng độ sâu. Vì vậy, tôi đã thay đổi loại nguồn thành 32bit float để phù hợp với việc tiêu hủy.

Ngoài ra tôi khuyên bạn nên sử dụng phiên bản mới hơn của OpenCV python API vì nó sử dụng mảng NumPy như kiểu dữ liệu chính:

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

Cảm ơn sự giúp đỡ của bạn. Đó là chính xác. – Cerin

-1

Đây là những gì làm việc cho tôi ...

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) 
Các vấn đề liên quan