获取某一帧、某一秒、某几秒画面

文章目录

  • 前言
  • 一、某一帧
  • 二、某一秒
  • 三、某几秒
  • 总结


前言

有时,我们在看一段视频时,又好看的画面,可以当作桌面背景,或者是喜欢的明星,好看的美女姐姐等,我们都可以通过程序实现截取


说明:
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
恰饭时间到~

你可能感兴趣的:(python,python)