I am able to extract the frames of a certain test.mp4
file using the following code:
import cv2
def get_frames():
cap = cv2.VideoCapture('test.mp4')
i = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
cv2.imwrite('test_'+str(i)+'.jpg', frame)
i += 1
cap.release()
cv2.destroyAllWindows()
A lot of the frames that are extracted are useless (they're nearly identical). I need to be able to set a certain rate at which the frame extraction can be done.
I think you need to just skip frames based on a fixed cycle.
import cv2
def get_frames():
cap = cv2.VideoCapture('test.mp4')
i = 0
# a variable to set how many frames you want to skip
frame_skip = 10
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if i > frame_skip - 1:
cv2.imwrite('test_'+str(i)+'.jpg', frame)
i = 0
continue
i += 1
cap.release()
cv2.destroyAllWindows()
Try below logic. Here, we are waiting for a period of time(based on frame rate) and reading the last frame.
def get_frames():
cap = cv2.VideoCapture('test.mp4')
frame_rate = 10
prev = 0
i = 0
while cap.isOpened():
time_elapsed = time.time() - prev
ret, frame = cap.read()
if not ret:
break
if time_elapsed > 1./frame_rate:
# print(time_elapsed)
prev = time.time()
cv2.imwrite('./data/sample1/test_'+str(i)+'.jpg', frame)
i += 1
cap.release()
cv2.destroyAllWindows()
As an alternative to writing your own code to do this, have you considered using FFMPEG? FFMPEG has the ability to extract all frames from a video and save them as images, it also can extract frames at a lower frame rate than the source video.
See here for a demonstration of what I think you're trying to do, and the arguments to give ffmpeg to do so.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.