将IplImage快速转换为Numpy数组

jab*_*jab 5 opencv numpy

较新的OpenCV的文档在这里说,你可以将IplImage结构转换为numpy的阵列,就像这样:

arr = numpy.asarray( im )
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

arr = numpy.fromstring( im.tostring(), dtype=numpy.float32 )
Run Code Online (Sandbox Code Playgroud)

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

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

小智 9

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

import cv2.cv as cv    #Just a formality!

Capture = cv.CaptureFromCAM(0)
Img = cv.QueryFrame(Capture)
Run Code Online (Sandbox Code Playgroud)

对象Img是一个ipimage,并且充其量numpy.asarray(Img)是不稳定.然而!Img[:,:]是一种cvmat类型,并且numpy.asarray(Img[:,:])工作得非常好,而且更重要:快速!

这是迄今为止我发现抓住一个框架并使其成为一个ndarraynumpy处理的最快方法.