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

时间:2012-03-23 15:24:33

标签: python opencv numpy

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

到目前为止我所做的工作,但实际上太慢了。我知道Python不是最有效的编程语言,但我相信它可以做得更好,因为内置的图像转换功能非常快。 Numpy可能是要走的路,但我还不熟悉它。

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

如何加快流程? 谢谢,b_m

2 个答案:

答案 0 :(得分:3)

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 )

使用:

cv.ConvertScale(frameImg, frameImg, scale=0.5)
cv.ShowImage( "My Video Window",  frameImg )

并且可以轻松实时播放,有很多很酷的功能可以让你合并视频等。

答案 1 :(得分:2)

Python for循环太慢了。如果您可以使用内置函数(或numpy或其他扩展模块)表达您的算法,请执行此操作。例如,使用ConvertScale可以轻松实现乘法常数示例。如果算法更复杂,则必须在C级实现它。 Cython是让这更容易的一种流行方式。