How to process images of a video, frame by frame, in video streaming using OpenCV and Python

后端 未结 6 859
鱼传尺愫
鱼传尺愫 2020-12-04 10:13

I am a beginner in OpenCV. I want to do some image processing on the frames of a video which is being uploaded to my server. I just want to read the available frames and wri

相关标签:
6条回答
  • 2020-12-04 10:38

    The only solution I have found is not to set the index to a previous frame and wait (then OpenCV stops reading frames, anyway), but to initialize the capture one more time. So, it looks like this:

    cap = cv2.VideoCapture(camera_url)
    while True:
        ret, frame = cap.read()
    
        if not ret:
            cap = cv.VideoCapture(camera_url)
            continue
    
        # do your processing here
    

    And it works perfectly!

    0 讨论(0)
  • 2020-12-04 10:40

    According to the latest updates for OpenCV 3.0 and higher, you need to change the Property Identifiers as follows in the code by Mehran:

    cv2.cv.CV_CAP_PROP_POS_FRAMES
    

    to

    cv2.CAP_PROP_POS_FRAMES
    

    and same applies to cv2.CAP_PROP_POS_FRAME_COUNT.

    Hope it helps.

    0 讨论(0)
  • 2020-12-04 10:48

    After reading the documentation of VideoCapture. I figured out that you can tell VideoCapture, which frame to process next time we call VideoCapture.read() (or VideoCapture.grab()).

    The problem is that when you want to read() a frame which is not ready, the VideoCapture object stuck on that frame and never proceed. So you have to force it to start again from the previous frame.

    Here is the code

    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
    
    0 讨论(0)
  • 2020-12-04 10:54

    In openCV's documentation there is an example for getting video frame by frame. It is written in c++ but it is very easy to port the example to python - you can search for each fumction documentation to see how to call them in python.

    #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;
    }
    
    0 讨论(0)
  • 2020-12-04 10:55

    This is how I would start to solve this:

    1. Create a video writer:

      import cv2.cv as cv
      videowriter = cv.CreateVideoWriter( filename, fourcc, fps, frameSize)
      

      Check here for valid parameters

    2. Loop to retrieve[1] and write the frames:

      cv.WriteFrame( videowriter, frame )
      

      WriteFrame doc

    [1] zenpoy already pointed in the correct direction. You just need to know that you can retrieve images from a webcam or a file :-)

    Hopefully I understood the requirements correct.

    0 讨论(0)
  • 2020-12-04 11:02

    Use this:

    import cv2
    cap = cv2.VideoCapture('path to 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 opened windows
    
    0 讨论(0)
提交回复
热议问题