Какой самый быстрый способ перебора CvMat в Python с использованием OpenCV? - PullRequest
2 голосов
/ 23 марта 2012

Я использую 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

Как я могу ускорить процесс?Спасибо, б_м

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

OpenCV имеет довольно хорошую документацию по Python здесь .По сути, вы всегда должны пытаться выполнять операции с видеокадрами, используя эти встроенные функции opencv, или numpy.Для обработки кадров взгляните на операций над массивами , с помощью которых вы можете заменить весь свой пиксель на цикл обработки пикселей, который абсурдно медленен:

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 )

и легко воспроизводить его в режиме реального времени, есть множество интересных функций, позволяющих объединять видео и т. Д.

2 голосов
/ 23 марта 2012

Python для циклов слишком медленный.Если вы можете выразить свой алгоритм, используя встроенные функции (или numpy или другой модуль расширения), сделайте этоНапример, ваш пример умножения на константу легко реализовать с помощью ConvertScale.Если алгоритм более сложный, вам придется реализовать его на уровне C. Cython - один из популярных способов сделать это проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...