将Numpy数组转换为OpenCV数组

时间:2011-09-28 18:03:46

标签: python numpy opencv image-processing

我正在尝试将表示黑白图像的2D Numpy数组转换为3通道OpenCV数组(即RGB图像)。

基于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

我做错了什么?

3 个答案:

答案 0 :(得分:28)

您的代码可以修改如下:

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)

简短说明:

    OpenCV不支持
  1. np.uint32数据类型(它支持uint8int8uint16int16int32,{{ 1}},float32
  2. float64无法处理numpy数组,因此两个参数都必须转换为OpenCV类型。 cv.CvtColor执行此转换。
  3. cv.fromarray的两个参数必须具有相同的深度。所以我已经将源类型更改为32位浮点数以匹配目标。
  4. 我还建议您使用较新版本的OpenCV python API,因为它使用numpy数组作为主要数据类型:

    cv.CvtColor

答案 1 :(得分:4)

最简单的解决方案是使用Pillow lib:

from PIL import Image

image = Image.fromarray(<your_numpy_array>.astype(np.uint8))

您可以将其用作图像。

答案 2 :(得分:2)

这对我有用......

class App extends Component {
  constructor(props){
    super(props)
  }
  ...
}