我正在使用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
答案 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是让这更容易的一种流行方式。