模块
video2dataset.py
import cv2
import os
class cliper:
# 初始化服务
def __init__(self, video_path = None, img_folder = None, img_title = "", jump_frame = 29):
self.video_path = video_path
self.img_folder = img_folder
self.img_title = img_title
self.jump_frame = jump_frame
def video_to_frames(self, play_flag = False):
cap = cv2.VideoCapture()
cap.open(self.video_path)
# frames_length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
index, count = 0 , 0
while cap.isOpened():
index += 1
ret, frame = cap.read()
if frame is None :
break
if ret:
if not os.path.exists(self.img_folder):
os.makedirs(self.img_folder)
if index % self.jump_frame == 0:
img_name = "{}{}.jpg".format(self.img_title, count)
file_name = os.path.join(self.img_folder, img_name)
# 保存转码后的文件
cv2.imencode('.jpg',frame,)[1].tofile(file_name)
count += 1
if play_flag:
cv2.imshow("result", frame)
if cv2.waitKey(25) & 0xff == 27:
break
cap.release()
cv2.destroyAllWindows()
def play(self):
cap = cv2.VideoCapture()
cap.open(self.video_path)
frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
print("共计:",frames)
count = 0
while cap.isOpened():
ret, frame = cap.read()
if frame is None :
print("Error...")
break
if ret:
print("frame: {}".format(count))
count += 1
cv2.imshow("result", frame)
if cv2.waitKey(25) & 0xff == 27:
break
cap.release()
cv2.destroyAllWindows()
测试代码
main.py
import video2dataset
video_path = "/home/feng/桌面/Video_to_dataset/VID_20220906_144710.mp4"
# 视频流
# cliper = video2dataset.cliper(video_path, "./images", 'IMG_', 25)
# 摄像头
cliper = video2dataset.cliper(0, "./images", 'IMG_', 25)
cliper.video_to_frames(play_flag=True)
# cliper.play()