将IplImage快速转换为Numpy数组

时间:2012-10-27 21:02:14

标签: opencv numpy

较新的OpenCV文档here表示您可以将IplImage转换为Numpy数组,如下所示:

arr = numpy.asarray( im )

但这不适合我的需要,因为它显然不支持数学:

x = arr/0.01
TypeError: unsupported operand type(s) for /: 'cv2.cv.iplimage' and 'float'

如果我尝试指定数据类型,我甚至无法做到这一点:

arr = numpy.asarray( im, dtype=num.float32 )
TypeError: float() argument must be a string or a number

所以我使用旧文档here中提供的代码。基本上,它是这样做的:

arr = numpy.fromstring( im.tostring(), dtype=numpy.float32 )

但是tostring调用真的很慢,可能是因为它正在复制数据?我需要这个转换非常快,而不是复制它不需要的任何缓冲区。我不认为数据本质上是不兼容的;我首先用cv.fromarray创建了我的IplImage,这非常快,并且被OpenCV函数接受。

我有没有办法让新的asarray方法为我工作,否则我可以以numpy.fromstring接受它的方式直接访问IplImage中的数据指针吗?我正在使用OpenCV 2.3.1预先打包用于Ubuntu Precise。

2 个答案:

答案 0 :(得分:9)

有趣的事实:
说你打电话:

import cv2.cv as cv    #Just a formality!

Capture = cv.CaptureFromCAM(0)
Img = cv.QueryFrame(Capture)

对象Imgipimage,而numpy.asarray(Img)充其量只是 。然而! Img[:,:]类型为cvmatnumpy.asarray(Img[:,:])效果极佳,而且更重要:快速!

这是迄今为止我发现抓住一个帧并使其成为ndarray进行numpy处理的最快方法。

答案 1 :(得分:0)

该页面没有说明IplImage。它说的是CvMat,这是不同的。

无论如何,你最好使用较新的cv2命名空间的包装器。它原生使用numpy数组而不是自己的图像容器。此外,整个cv模块被视为已弃用,并将在最近的主要版本中完全删除。