2012-03-28 925 views
10

使用OpenCV 2,IPython现在默认使用NumPy数组。将NumPy数组转换为cvMat cv2

cvimage = cv2.imread("image.png") #using OpenCV 2 
type(cvimage) 
Out: numpy.ndarray #dtype is uint8 

pltimage = plt.imread("image.png") #using Matplotlib 
type(pltimage) 
Out: numpy.ndarray #dtype is float 

plt.imshow(cvimage) # works great 

cv2.imshow(cvimage) 
TypeError: Required argument 'mat' (pos 2) not found 

cv2由于默认使用NumPy的阵列,不再有任何CV ::垫构造和NumPy的不具有功能转换为cv::Mat阵列。

任何想法?

+1

是的,这已经得到了回答 - 您实际上不会错过第二个参数,而是第一个。但是,我带着另一个问题来到这里:并不是每个'uint8'类型的'numpy.ndarray'都可以显示。我做了一个切片,得到一个图像的单个通道,比如'red = frame [:,:,0]',然后在'imshow'中得到一个异常。我怀疑这是因为稀疏。 'red = frame [:,:,0] .copy()'修复了这个问题。 – 2015-01-02 14:39:46

回答

14

该函数具有以下文档字符串:imshow(winname, mat) -> None。 您可以在解释器中输入cv2.imshow.__doc__来查看文档字符串。

尝试cv2.imshow('Image', cvimage)

+2

当我做'cvimage = cv2.imread('image.png')'后面跟着'cv2.imshow('Image',cvimage)',不会返回任何错误并显示图像。 – zarthur 2012-03-28 18:55:01

+0

没有导入numpy,它们返回的类型是'numpy.ndarray'。 – zarthur 2012-03-28 19:10:30

+1

你错过了一个必需的arg – Neon22 2012-03-30 11:20:51

3

Mat由于C/C++缺少矩阵的标准/本地实现,因此需要使用对象。

但是,numpyarray是该功能的完美替代品。因此,cv2模块接受numpy.array,无论文档中是否显示矩阵。

14

这个问题在技术上问如何将NumPy数组(类似于CV2数组)转换为Mat对象(CV)。

mat_array = cv.fromarray(numpy_array) 

其中mat_array是垫目标,并numpy_array是NumPy的阵列或图像:对于任何人谁是有兴趣的,这可以这样做。 我建议尽可能远离较旧的CV结构。 Numpy数组提供的性能比本机Python中的实现要好得多

+9

这是为cv不cv2 – 2016-04-08 10:43:17

+0

我们应该如何在C++和cv2中做到这一点? – 2017-06-13 01:16:35