복붙노트

[PYTHON] Opencv python을 사용하여 비디오 스트리밍에서 프레임 단위로 비디오 이미지를 처리하는 방법

PYTHON

Opencv 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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    5.이것이 내가이 문제를 풀 수있는 방법입니다 :

    이것이 내가이 문제를 풀 수있는 방법입니다 :

    [1] zenpoy는 이미 올바른 방향을 지적했습니다. 웹캠이나 파일에서 이미지를 검색 할 수 있다는 것을 알아야합니다.

    바라건대 나는 요구 사항이 정확하다는 것을 이해했다.

  6. ==============================

    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
    

    그리고 완벽하게 작동합니다!

  7. 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