在Python中使用OpenCV迭代CvMat的最快方法是什么?

2024-06-23 19:17:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用OpenCV和Python来处理视频流。我想实现我自己的算法,所以我需要迭代每一帧。在

到目前为止,我所拥有的是有效的,但是太慢了,不能实时。我知道Python不是最高效的编程语言,但是考虑到内置的图像转换函数非常快,我相信它可以做得更好。纽姆也许是个不错的选择,但我还不太熟悉。在

import cv, numpy
vidFile = cv.CaptureFromFile( 'sample.avi' )
nFrames = int(  cv.GetCaptureProperty( vidFile, cv.CV_CAP_PROP_FRAME_COUNT ) )
for f in xrange( nFrames ):
  frameImg = cv.QueryFrame( vidFile )
  frameMat=cv.GetMat(frameImg)
  print "mat ", mat[3,1]
  for x in xrange(frameMat.cols):
    for y in xrange(frameMat.rows):
        # just an example, multiply all 3 components by 0.5
        frameMat[y, x] = tuple(c*0.5 for c in frameMat[y, x])
  cv.ShowImage( "My Video Window",  frameMat )
  if cv.WaitKey( waitPerFrameInMillisec  ) == 27:
    break

我怎样才能加快这个过程? 谢谢你,贝姆


Tags: in图像算法for编程语言opencv内置cv
2条回答

OpenCV有很好的python文档here。基本上,您应该始终尝试使用这些内置的opencv函数或numpy对视频帧进行操作。对于帧处理,请看一看operations on arrays,使用它,您可以用像素替换整个像素处理循环,其速度非常慢:

frameMat=cv.GetMat(frameImg)
print "mat ", mat[3,1]
for x in xrange(frameMat.cols):
    for y in xrange(frameMat.rows):
        # just an example, multiply all 3 components by 0.5
        frameMat[y, x] = tuple(c*0.5 for c in frameMat[y, x])
cv.ShowImage( "My Video Window",  frameMat )

有:

^{pr2}$

而且很容易实时播放,有很多很酷的功能可以让你合并视频等

Python for循环太慢了。如果您可以使用内置函数(或numpy或其他扩展模块)来表达您的算法,那么就这样做。例如,使用ConvertScale很容易实现乘以常量的示例。如果算法更复杂,则必须在C级实现。Cython是一种流行的简化方法。在

相关问题 更多 >

    热门问题