有时,我们在看一段视频时,又好看的画面,可以当作桌面背景,或者是喜欢的明星,好看的美女姐姐等,我们都可以通过程序实现截取
说明:
1.某一帧是你具体知道的某一帧,比如在我做过的人脸标记工作中,在某一帧出错误了,就需要找到这一帧的画面,具体分析原因
2.这里需要了解一个概念,fps:每秒多少帧,了解了这个之后尼,根据自己的需求,参考一下代码,完成自己的需求
3.某一秒既可以指一秒的时间内的所有画面,也可以指一秒之内的任意画面(即任意帧)
4.本质上某几秒的画面,和某一秒之内所有画面有着异曲同工之妙
5.某一帧,某一秒中的任意一帧也有着异曲同工之妙
连续的画面是有许多帧组成了,一帧就是一个画面,了解了这些,就开始操作了
注释很详细的哦!记得点赞哦!
import cv2
cap = cv2.VideoCapture('../test/04.mp4') #需要读取的视频路径
n=0 #帧数
while cap.isOpened():#成功打开摄像头,或者成功读取视频
# 从摄像头或者视频读取一帧,ret是表明成功与否
ret, frame = cap.read()
if ret:#读取成功
n+=1#表明是第一帧
if n==20:#假设第二十帧是我们想要的画面
#第一个参数里面一定要有要保存的照片格式,例如.jpg .jpeg .png
#名称可以随便
cv2.imwrite(f"第{n}帧"+".jpg",frame)
#cv2.imshow('frame',frame) #放到此处只展示第二十帧的画面
#cv2.waitKey(0)
#展示画面,即显示cap读取的内容
cv2.imshow('frame',frame)
else:
break
# 监听键盘,按下q键退出
if cv2.waitKey(25) & 0xFF == ord('q'):
break
##释放
cap.release()
#销毁所有窗口
cv2.destroyAllWindows()
import cv2
def fps(path):
video = cv2.VideoCapture(path)
# 找到cv2版本号
(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
if int(major_ver) < 3:
FPS = video.get(cv2.cv.CAP_PROP_FPS)
else:
FPS = video.get(cv2.CAP_PROP_FPS)
video.release()
return FPS
Path="../test/04.mp4"
cap = cv2.VideoCapture(Path) #需要读取的视频路径
n=0 #帧数
s=2 #秒 需要获取那一秒的画面(所有)
fp = fps(Path)#需要通过fps计算秒数
#print(fp)
while cap.isOpened():#成功打开摄像头,或者成功读取视频
# 从摄像头或者视频读取一帧,ret是表明成功与否
ret, frame = cap.read()
if ret:#读取成功
n+=1#表明是第一帧
if int(n/fp)==(s-1):#通过取整,获取当前的秒数,-1是因为计算机是从0开始,我们是从1开始,所以需要减一
cv2.imwrite(f"第{int(n/fp)}秒_第{n}帧"+".jpg",frame)
#这里保存的是某一秒之内的所有帧数画面,需要注意命名问题,如果命名重复,则会覆盖原来的图象
#展示画面,即显示cap读取的内容
cv2.imshow('frame',frame)
else:
break
# 监听键盘,按下q键退出
if cv2.waitKey(25) & 0xFF == ord('q'):
break
##释放
cap.release()
#销毁所有窗口
cv2.destroyAllWindows()
import cv2
def fps(path):
video = cv2.VideoCapture(path)
# 找到cv2版本号
(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
if int(major_ver) < 3:
FPS = video.get(cv2.cv.CAP_PROP_FPS)
else:
FPS = video.get(cv2.CAP_PROP_FPS)
video.release()
return FPS
Path="../test/04.mp4"
cap = cv2.VideoCapture(Path) #需要读取的视频路径
n=0 #帧数
start = 2 #开始的秒
end =3 #结束的秒
a=0
fp = fps(Path)
print(fp)
while cap.isOpened():#成功打开摄像头,或者成功读取视频
# 从摄像头或者视频读取一帧,ret是表明成功与否
ret, frame = cap.read()
if ret:#读取成功
n+=1#表明是第一帧
# 通过取整,获取当前的秒数,-1是因为计算机是从0开始,我们是从1开始,所以需要减一
# end没有减一是因为python里面 in () 括号是一个左闭右开的区间,不需要减一
#这里选区的是2-3秒,存在歧义,此处是1-2秒,2-3秒,总共2秒的时间
#如果只需要start-end之间的秒的话,只需要把end改为end-1即可
if int(n/fp) in (start-1,end):
cv2.imwrite(f"第{int(n/fp)}_第{n}帧"+".jpg",frame)
#展示画面,即显示cap读取的内容
cv2.imshow('frame',frame)
else:
break
# 监听键盘,按下q键退出
if cv2.waitKey(25) & 0xFF == ord('q'):
break
##释放
cap.release()
#销毁所有窗口
cv2.destroyAllWindows()
以上几种方法都有异曲同工之妙,稍加注意就会发现
我们需要主义的是使用VideoCapture函数是,传参和不传参的区别(不传参:通过摄像头输入,传参:视频输入)
为了计算秒数,我们需要获取视频的fps
相关文章:
获取视频fps、总帧数
脸部标记详解——摄像头输入
写于2021.05.10 17:04
恰饭时间到~