较新的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处理的最快方法.
| 归档时间: |
|
| 查看次数: |
7981 次 |
| 最近记录: |