这里较新的 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。