Cer*_*rin 24 python opencv numpy image-processing
我正在尝试将表示黑白图像的2D Numpy阵列转换为3通道OpenCV阵列(即RGB图像).
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)
Run Code Online (Sandbox Code Playgroud)
但是,对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
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
And*_*aev 32
您的代码可以修复如下:
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)
Run Code Online (Sandbox Code Playgroud)
简短说明:
np.uint32数据类型不受OpenCV的支持(它支持uint8,int8,uint16,int16,int32,float32,float64)cv.CvtColor无法处理numpy数组,因此两个参数都必须转换为OpenCV类型.cv.fromarray做这个转换.cv.CvtColor必须具有相同的深度.所以我已经将源类型更改为32位浮点数以匹配目标.另外,我建议您使用较新版本的OpenCV python API,因为它使用numpy数组作为主要数据类型:
import numpy as np, cv2
vis = np.zeros((384, 836), np.float32)
vis2 = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR)
Run Code Online (Sandbox Code Playgroud)
这对我有用...
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82006 次 |
| 最近记录: |