最近做项目需要对视频进行分析,故写了个方便分析视频的代码。主要功能如下,读取视频后处理播放,其中有几个快捷按键:a返回上一帧,s开启/关闭自动播放,d切换到下一帧,q后退两秒,w将当前图片保存下来,e前进两秒,其他参看代码注释。
import cv2
def draw_something(frame):
# 画框, 注意:若画的线太细经过缩放线可能消失
frame = cv2.rectangle(frame, (260, 230), (1660, 690), (0, 0, 255), 2)
# 图片缩放
frame = cv2.resize(frame, (1280, 720))
return frame
path_video = r'J:\路测视频\G410\G410D-1227\G410D-1227\CARDV\RO\20211227175432_000008A.MP4' # 要播放的视频路径
OutPutImgPath = r'J:\Temp\Temp1' # 要保存图片的目录
Start = 0 # 从第Start秒播放视频
video = cv2.VideoCapture(path_video)
fps = video.get(cv2.CAP_PROP_FPS)
StarFrame = fps * Start
video.set(cv2.CAP_PROP_POS_FRAMES, StarFrame)
NameNum = 0
auto_model = False
success, frame = video.read()
while success:
# 图像处理部分,可在函数内画框、画线、缩放
frame = draw_something(frame)
cv2.imshow('frame', frame)
if auto_model:
key = cv2.waitKey(int(1000 / int(fps)))
else:
key = cv2.waitKey(0)
if ord('w') == key: # 保存处理后的图片
NameNum += 1
if cv2.imwrite(OutPutImgPath + '\\V%05d.jpg' % NameNum, frame):
print('Write %s successful' % OutPutImgPath + '\\V%05d.jpg' % NameNum) # 图片保存成功
else:
print('Write %s failure!' % OutPutImgPath + '\\V%05d.jpg' % NameNum) # 图片保存失败,或因为是中文路径
video.set(cv2.CAP_PROP_POS_FRAMES, StarFrame)
elif ord('W') == key: # 保存原图
video.set(cv2.CAP_PROP_POS_FRAMES, StarFrame)
success, frame = video.read()
NameNum += 1
if cv2.imwrite(OutPutImgPath + '\\V%05d.jpg' % NameNum, frame):
print('Write %s successful' % OutPutImgPath + '\\S%05d.jpg' % NameNum) # 图片保存成功
else:
print('Write %s failure!' % OutPutImgPath + '\\S%05d.jpg' % NameNum) # 图片保存失败,或因为是中文路径
video.set(cv2.CAP_PROP_POS_FRAMES, StarFrame)
elif ord('a') == key: # 按下a返回上一帧
StarFrame -= 1
video.set(cv2.CAP_PROP_POS_FRAMES, StarFrame)
elif ord('d') == key: # 按d切换到下一帧
StarFrame += 1
elif ord('s') == key: # 按s开启/关闭自动播放模式
auto_model = 1 - auto_model
StarFrame += 1
elif ord('e') == key: # 按e将视频快进2秒
StarFrame += 2 * fps
video.set(cv2.CAP_PROP_POS_FRAMES, StarFrame)
elif ord('q') == key: # 按q将视频后退两秒
StarFrame -= 2 * fps
video.set(cv2.CAP_PROP_POS_FRAMES, StarFrame)
elif -1 == key:
StarFrame += 1
elif -1 != key:
video.set(cv2.CAP_PROP_POS_FRAMES, StarFrame)
success, frame = video.read() # 获取下一帧
video.release()
程序运行时的画面
保存图片成功提示
保存的图片