Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 write them in a directory. Then, wait for the other part of the video to be uploaded and write the frames to the directory. And , I should wait for each frame to be completely uploaded then write it to a file.

Can you tell me how can I do it with OpenCV (Python)?

Edit 1: I wrote this code for capturing the video from a file, while new data are being appended at the end of the file. In other words, the out.mp4 file is not a complete video and another program is writing new frames on it. What I'm going to do is, wait for the other program to write new frames then read them and display them.

Here is my code:

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 

So the problem is the cap.grab() call! When there is no frame, it will return False! And it won't capture frames anymore, even if I wait for a long time.

like image 336
Mehran Avatar asked Sep 23 '13 08:09

Mehran


1 Answers

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 
like image 200
Mehran Avatar answered Sep 25 '22 16:09

Mehran