저는 파이썬에서 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
이것이 올바른 방법이라는 것을 알고 있습니다.하지만 이제는 배열을 반복하지 않고 실행할 수없는 작업을 수행해야합니다. 글쎄, 가능할 수도 있지만, 방법을 찾아 낼 수가 없다. 예를 들어, 이미지의 첫 번째 (왼쪽 위) 빨간색 픽셀은 어떻게 찾을 수 있습니까? 이러한 것들은 루프가있는 케이크 조각이 될 것입니다. –
@b_m -'frameImg [0,0]'는 왼쪽 상단 픽셀의 RGB 값을 제공합니다. 당신이 실제로하고 싶은 것을 설명 할 수 있습니까? 그렇다면 더 많은 것을 도울 수있을 것입니다.) – fraxel
빨간색으로 표시된 첫 번째 픽셀을 의미합니다. 장기적으로 내가하고 싶은 것을 알지 못합니다. 어느 시점에서 루프를 사용하는 것은 불가피합니다. –