5

这里较新的 OpenCV 文档说您可以像这样将 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

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

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

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

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

4

2 回答 2

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 处理的方法。

于 2013-04-28T14:32:46.797 回答
0

那页没有说关于IplImage。它说CvMat哪个是不同的。

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

于 2012-10-28T10:07:09.910 回答