较新的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。
答案 0 :(得分:9)
import cv2.cv as cv #Just a formality!
Capture = cv.CaptureFromCAM(0)
Img = cv.QueryFrame(Capture)
对象Img
是ipimage
,而numpy.asarray(Img)
充其量只是 。然而! Img[:,:]
类型为cvmat
,numpy.asarray(Img[:,:])
效果极佳,而且更重要:快速!
这是迄今为止我发现抓住一个帧并使其成为ndarray
进行numpy处理的最快方法。
答案 1 :(得分:0)
该页面没有说明IplImage
。它说的是CvMat
,这是不同的。
无论如何,你最好使用较新的cv2
命名空间的包装器。它原生使用numpy数组而不是自己的图像容器。此外,整个cv
模块被视为已弃用,并将在最近的主要版本中完全删除。