[PYTHON] Opencv python을 사용하여 비디오 스트리밍에서 프레임 단위로 비디오 이미지를 처리하는 방법
PYTHONOpencv python을 사용하여 비디오 스트리밍에서 프레임 단위로 비디오 이미지를 처리하는 방법
저는 OpenCV에서 초보자입니다. 내 서버에 업로드되는 비디오 프레임에서 일부 이미지 처리를하고 싶습니다. 사용 가능한 프레임을 읽고 디렉토리에 씁니다. 그리고 비디오의 다른 부분이 업로드 될 때까지 기다렸다가 프레임을 디렉토리에 씁니다. 그리고 각 프레임이 완전히 업로드 된 다음 파일에 기록 될 때까지 기다려야합니다.
OpenCV (Python)로 어떻게 할 수 있습니까?
편집 1 : 필자는 파일에서 비디오를 캡처하기 위해이 코드를 작성했지만 파일의 끝에 새 데이터가 추가되었습니다. 즉, out.mp4 파일은 완전한 비디오가 아니며 다른 프로그램이 새 프레임을 쓰는 것입니다. 제가 할 일은 다른 프로그램이 새 프레임을 작성한 다음에 그것을 읽고 표시하는 것을 기다리는 것입니다.
여기 내 코드가 있습니다 :
import cv2
cap = cv2.VideoCapture("./out.mp4")
while True:
if cap.grab():
flag, frame = cap.retrieve()
if not flag:
continue
else:
cv2.imshow('video', frame)
if cv2.waitKey(10) == 27:
break
그래서 문제는 cap.grab () 호출입니다! 프레임이 없으면 False를 반환합니다. 그리고 오래 동안 기다리더라도 프레임을 더 이상 캡처하지 않습니다.
해결법
-
==============================
1.VideoCapture의 설명서를 읽은 후. VideoCapture에 다음 번에 VideoCapture.read () (또는 VideoCapture.grab ())를 호출 할 때 어떤 프레임을 처리할지 알 수 있다고 생각했습니다.
VideoCapture의 설명서를 읽은 후. VideoCapture에 다음 번에 VideoCapture.read () (또는 VideoCapture.grab ())를 호출 할 때 어떤 프레임을 처리할지 알 수 있다고 생각했습니다.
문제는 준비되지 않은 프레임을 읽으려고 할 때 VideoCapture 객체가 해당 프레임에 달라 붙어서 계속 진행하지 않는다는 것입니다. 따라서 이전 프레임에서 다시 시작해야합니다.
여기에 코드가있다.
import cv2 cap = cv2.VideoCapture("./out.mp4") while not cap.isOpened(): cap = cv2.VideoCapture("./out.mp4") cv2.waitKey(1000) print "Wait for the header" pos_frame = cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES) while True: flag, frame = cap.read() if flag: # The frame is ready and already captured cv2.imshow('video', frame) pos_frame = cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES) print str(pos_frame)+" frames" else: # The next frame is not ready, so we try to read it again cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, pos_frame-1) print "frame is not ready" # It is better to wait for a while for the next frame to be ready cv2.waitKey(1000) if cv2.waitKey(10) == 27: break if cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES) == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT): # If the number of captured frames is equal to the total number of frames, # we stop break
-
==============================
2.이것을 사용하십시오 -
이것을 사용하십시오 -
import cv2 cap = cv2.VideoCapture('path of video file') count = 0 while cap.isOpened(): ret,frame = cap.read() cv2.imshow('window-name',frame) cv2.imwrite("frame%d.jpg" % count, frame) count = count + 1 if cv2.waitKey(10) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() # destroy all the opened windows
-
==============================
3.OpenCV의 문서에는 프레임 단위로 비디오를 가져 오는 예제가 있습니다. C ++로 작성되었지만 예제를 Python으로 이식하는 것은 매우 쉽습니다. 파이썬으로 호출하는 방법을 보려면 각 fumction 문서를 검색 할 수 있습니다.
OpenCV의 문서에는 프레임 단위로 비디오를 가져 오는 예제가 있습니다. C ++로 작성되었지만 예제를 Python으로 이식하는 것은 매우 쉽습니다. 파이썬으로 호출하는 방법을 보려면 각 fumction 문서를 검색 할 수 있습니다.
#include "opencv2/opencv.hpp" using namespace cv; int main(int, char**) { VideoCapture cap(0); // open the default camera if(!cap.isOpened()) // check if we succeeded return -1; Mat edges; namedWindow("edges",1); for(;;) { Mat frame; cap >> frame; // get a new frame from camera cvtColor(frame, edges, CV_BGR2GRAY); GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); Canny(edges, edges, 0, 30, 3); imshow("edges", edges); if(waitKey(30) >= 0) break; } // the camera will be deinitialized automatically in VideoCapture destructor return 0; }
-
==============================
4.OpenCV 3.0 이상에 대한 최신 업데이트에 따르면 Mehran의 코드에서 다음과 같이 속성 식별자를 변경해야합니다.
OpenCV 3.0 이상에 대한 최신 업데이트에 따르면 Mehran의 코드에서 다음과 같이 속성 식별자를 변경해야합니다.
cv2.cv.CV_CAP_PROP_POS_FRAMES
에
cv2.CAP_PROP_POS_FRAMES
cv2.CAP_PROP_POS_FRAME_COUNT에도 동일하게 적용됩니다.
희망이 도움이됩니다.
-
==============================
5.이것이 내가이 문제를 풀 수있는 방법입니다 :
이것이 내가이 문제를 풀 수있는 방법입니다 :
[1] zenpoy는 이미 올바른 방향을 지적했습니다. 웹캠이나 파일에서 이미지를 검색 할 수 있다는 것을 알아야합니다.
바라건대 나는 요구 사항이 정확하다는 것을 이해했다.
-
==============================
6.내가 찾은 유일한 해결책은 인덱스를 이전 프레임으로 설정 한 다음 대기 (OpenCV가 프레임 읽기를 중단 함)하는 것이 아니라 캡처를 한 번 더 초기화하는 것입니다. 그래서, 다음과 같이 보입니다 :
내가 찾은 유일한 해결책은 인덱스를 이전 프레임으로 설정 한 다음 대기 (OpenCV가 프레임 읽기를 중단 함)하는 것이 아니라 캡처를 한 번 더 초기화하는 것입니다. 그래서, 다음과 같이 보입니다 :
cap = cv2.VideoCapture(camera_url) while True: ret, frame = cap.read() if not ret: cap = cv.VideoCapture(camera_url) continue # do your processing here
그리고 완벽하게 작동합니다!
from https://stackoverflow.com/questions/18954889/how-to-process-images-of-a-video-frame-by-frame-in-video-streaming-using-opencv by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이 게임에 투명한 직사각형을 그립니다. (0) | 2018.10.20 |
---|---|
[PYTHON] urllib2를 사용하는 모듈을 단위 테스트하려면 어떻게합니까? (0) | 2018.10.20 |
[PYTHON] 파이썬에서 함수에 타임 아웃을 추가하는 법 (0) | 2018.10.20 |
[PYTHON] python 숫자 식을 LaTeX로 변환하기 (0) | 2018.10.20 |
[PYTHON] Beautifulsoup - nextSibling (0) | 2018.10.20 |