2012-03-23 2 views
2

저는 파이썬에서 OpenCV를 사용하여 비디오 스트림을 처리하고 있습니다. 내 자신의 알고리즘을 구현하고 싶습니다, 그래서 각 프레임을 반복해야합니다.OpenCV를 사용하여 파이썬에서 CvMat을 반복하는 가장 빠른 방법은 무엇입니까?

내가 지금까지 사용해 왔지만 실시간으로보기에는 너무 느립니다. 파이썬이 가장 효율적인 프로그래밍 언어는 아니지만, 내장 된 이미지 변환 기능이 매우 빠르다는 점을 고려할 때 파이썬이 이보다 훨씬 더 잘할 수 있다고 생각합니다. 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

답변

3

OpenCV는 꽤 좋은 파이썬 문서 here을 가지고 있습니다. 기본적으로 항상 이러한 내장 된 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) 

과 : 프레임 처리를 위해 당신이 터무니없이 느린 픽셀 처리 루프에 의해 전체 픽셀을 대체 할 수있는이 사용 operations on arrays에서 살펴 쉽게

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

실시간으로 재생할 , 당신이 비디오 등을 병합 할 수 있도록 멋진 기능들이 있습니다.

+0

이것이 올바른 방법이라는 것을 알고 있습니다.하지만 이제는 배열을 반복하지 않고 실행할 수없는 작업을 수행해야합니다. 글쎄, 가능할 수도 있지만, 방법을 찾아 낼 수가 없다. 예를 들어, 이미지의 첫 번째 (왼쪽 위) 빨간색 픽셀은 어떻게 찾을 수 있습니까? 이러한 것들은 루프가있는 케이크 조각이 될 것입니다. –

+1

@b_m -'frameImg [0,0]'는 왼쪽 상단 픽셀의 RGB 값을 제공합니다. 당신이 실제로하고 싶은 것을 설명 할 수 있습니까? 그렇다면 더 많은 것을 도울 수있을 것입니다.) – fraxel

+0

빨간색으로 표시된 첫 번째 픽셀을 의미합니다. 장기적으로 내가하고 싶은 것을 알지 못합니다. 어느 시점에서 루프를 사용하는 것은 불가피합니다. –

1

루프 용 Python은 너무 느립니다. 내장 함수 (또는 numpy 또는 다른 확장 모듈)를 사용하여 알고리즘을 표현할 수 있다면 그렇게하십시오. 예를 들어, 귀하의 다중 상수 예제는 ConvertScale을 사용하여 쉽게 구현할 수 있습니다. 알고리즘이 더 복잡하면 C 레벨에서 알고리즘을 구현해야합니다. Cython은 그 일을 쉽게하기위한 인기있는 방법 중 하나입니다.

+0

이것은 좋은 생각 일 수 있습니다, 나는 그것에 대해 조사 할 것입니다. opencv-cython이라는 프로젝트가 있지만 opencv2.0을 사용합니다. –

관련 문제