python实现拍照,录像,剪辑,分帧等操作

来源:互联网 发布:ubuntu c语言开发工具 编辑:程序博客网 时间:2024/06/02 07:17

在图像处理中,我们经常需要通过设备对场景进行录像,拍照,以及视频处理等工作,本文将具体介绍一下利用python 实现一下这些功能。
配置环境
首先安装python-opencv ,在前面的文章我已经介绍过了,只需要一行命令即可

sudo apt-get install python-opencv

安装完openv 之后,我们即可操作了。
摄像头获取:
在这里我的VideoCapture(1),由于小博的摄像头出了问题,用的外接的USB摄像头,一般这个参数为0(大家要注意一下),在linux系统下,大家可以使用命令

ls /dev/video*

查看一下,会显示/dev/video..你的摄像头编号,将编号填入cv2.videoCapture() 括号里即可

#!/usr/bin/python# -*- coding: utf-8 -*-import cv2import numpy as npcap=cv2.VideoCapture(1)  #此处填入摄像头while(1):    ret,frame=cap.read()   #get frame    cv2.imshow("xiaorun",frame)    if cv2.waitKey(1)&0xFF==ord('q')or ret==False:        breakcap.release()cv2.destroyAllwindows()

保存
接下来我们对上述获得的图像以时间命名来进行保存,首先贴出获取摄像头图像保存的代码,我给出了必要的注释:

#!/usr/bin/python# -*- coding: utf-8 -*-import cv2import numpy as npimport time     #导入时间模块c=time.time() t=time.ctime(c)   获得当前系统时间videoname=str(t)+'.avi'fourcc = cv2.cv.CV_FOURCC('M', 'P', '4', '2') # 为保存视频做准备,构建了一个对象,其中10为帧率,自己可按照需要修改out=cv2.VideoWriter(videoname,fourcc,10,(640,480)) cap=cv2.VideoCapture(1)while(1):    ret,frame=cap.read()   #get frame    cv2.imshow("xiaorun",frame)    out.write(frame)    if cv2.waitKey(1)&0xFF==ord('q')or ret==False:        breakcap.release()cv2.destroyAllwindows()

copy以上代码运行即可看到当前路径下你摄像头的录像了。
图片的保存
拍照功能说白了其实就是单张图像的保存,同样我们只需要对上述录像的代码做一点小小的修改即可完成拍照和录像两不误的功能

#!/usr/bin/python# -*- coding: utf-8 -*-import cv2import numpy as npimport time c=time.time() # 为保存视频做准备t=time.ctime(c)i=1videoname=str(t)+'.avi'fourcc = cv2.cv.CV_FOURCC('M', 'P', '4', '2')out=cv2.VideoWriter(videoname,fourcc,10,(640,480))cap=cv2.VideoCapture(1)while(1):    ret,frame=cap.read()   #get frame    cv2.imshow("xiaorun",frame)    if i==99:        #第99帧的时候保存图像,可自行修改    cv2.imwrite('xiaorun.jpg', frame)    i=i+1    out.write(frame)    if cv2.waitKey(1)&0xFF==ord('q')or ret==False:        breakcap.release()cv2.destroyAllwindows()

在上面的例子中完成的拍照功能,由于没有一个控制界面,我特意选择了一个if判断,在第99帧的时候触发拍照功能,所以大家可以按照需求自行修改。保存图片的格式为.jpg
视频的剪辑
在看完上面的讲解一下,大家对利用openv对图像的操作也有了基本的理解,其实剪辑也就是保存从你需要的某一帧图像开始到另一位置的帧(貌似不太通顺,不管了,理解就好),在程序中你可以把videoCapture()中改成需要导入的视频,下面我贴出代码讲解:

#!/usr/bin/python# -*- coding: utf-8 -*-import cv2import numpy as npimport time c=time.time() # 为保存视频做准备t=time.ctime(c)i=1videoname=str(t)+'.avi'fourcc = cv2.cv.CV_FOURCC('M', 'P', '4', '2')out=cv2.VideoWriter(videoname,fourcc,10,(640,480))cap=cv2.VideoCapture(1)cv2.namedWindow('test.avi',cv2.WINDOW_NORMAL)while(1):    ret,frame=cap.read()   #get frame    cv2.imshow("test.avi",frame)    if i==99:    cv2.imwrite('xiaorun.jpg', frame)    i=i+1    out.write(frame)    if cv2.waitKey(1)&0xFF==ord('q')or ret==False:        breakcap.release()cv2.destroyAllwindows()

在这里我剪辑的是99到299帧视频,大家可以按照自己的需求进行修改,为了方便和更加精确的剪辑,在这里我们可以利用putText函数对视频帧数进行显示一下,从而好确认自己需要的是哪一帧到哪一帧是自己所需。大家可以看一下效果图:
这里写图片描述

#!/usr/bin/python# -*- coding: utf-8 -*-import cv2import numpy as npimport time c=time.time() # 为保存视频做准备t=time.ctime(c)i=1videoname=str(t)+'.avi'fourcc = cv2.cv.CV_FOURCC('M', 'P', '4', '2')out=cv2.VideoWriter(videoname,fourcc,10,(640,480))cap=cv2.VideoCapture(1)#cv2.namedWindow('test.avi',cv2.WINDOW_NORMAL)while(1):    ret,frame=cap.read()   #get frame    cv2.putText(frame,'##',(20,20),cv2.FONT_HERSHEY_PLAIN,2.0,(255,255,255),2,1)    cv2.putText(frame,str(i),(80,20),cv2.FONT_HERSHEY_PLAIN,2.0,(255,255,255),2,1)    cv2.imshow("test.avi",frame)   # if i==99:   #    cv2.imwrite('xiaorun.jpg', frame)    if i>99 and i<299:        out.write(frame)    i=i+1    if cv2.waitKey(1)&0xFF==ord('q')or ret==False:        breakcap.release()cv2.destroyAllwindows()

最后分帧的操作就交给大家自己完成吧,就是将图片分成一张纸图片,只需要将上面代码修改一行即可完成。

原创粉丝点击