python实现拍照,视频保存,录像,剪辑,分帧等操作

在图像处理中,我们经常需要通过设备对场景进行录像,拍照,以及视频处理等工作,本文将具体介绍一下利用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 cv2
import numpy as np
cap=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:
        break
cap.release()
cv2.destroyAllwindows()

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import 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:
        break
cap.release()
cv2.destroyAllwindows()

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import time 
c=time.time() # 为保存视频做准备
t=time.ctime(c)
i=1
videoname=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:
        break
cap.release()
cv2.destroyAllwindows()

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import time 
c=time.time() # 为保存视频做准备
t=time.ctime(c)
i=1
videoname=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:
        break
cap.release()
cv2.destroyAllwindows()

在这里我剪辑的是99到299帧视频,大家可以按照自己的需求进行修改,为了方便和更加精确的剪辑,在这里我们可以利用putText函数对视频帧数进行显示一下,从而好确认自己需要的是哪一帧到哪一帧是自己所需。大家可以看一下效果图:
python实现拍照,视频保存,录像,剪辑,分帧等操作_第1张图片

#!/usr/bin/python
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import time 
c=time.time() # 为保存视频做准备
t=time.ctime(c)
i=1
videoname=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:
        break
cap.release()
cv2.destroyAllwindows()

最后分帧的操作就交给大家自己完成吧,就是将图片分成一张纸图片,只需要将上面代码修改一行即可完成。
视频保存工作,切记,视频保存图片的大小一定要和设置的保存图片大小一致,否则保存会出很多问题

import cv2
import numpy as np

*# 选取摄像头,0为笔记本内置的摄像头,1,2···为外接的摄像头**
cap = cv2.VideoCapture(0)

*#定义摄像头的分辨率
*# cap.set(3,1080)**
cap.set(4,720)

*#大量的错和坑出现在这里
*#第一个参数是路径和文件名
*#第二个参数是视频格式,“MPEG”是一**种标准格式,百度fourcc可见各种格式
*#第二个参数(fourcc)如果设置为-1,允许实时选择视频格式
fourcc = cv2.VideoWriter_fourcc(*"MPEG")
*#fourcc=-1**

*# 第三个参数则是镜头快慢的,20为正常,小于二十为慢镜头**
out = cv2.VideoWriter('c://output.avi',fourcc,20,(640,480))

while True:

    ret,frame = cap.read()  # 获取图像
    if ret == True:
        frame = cv2.flip(frame, 1)# 在帧上进行操作

        cv2.imshow("frame", frame)  # 显示帧

        out.write(frame) # 保存视频

        if cv2.waitKey(1) == ord('s'):  #按下‘s’保存图片
            print('save photo\n')
            cv2.imwrite("c:\\new.png",frame)

        if cv2.waitKey(1) == ord('q'):#按下‘q’退出
            print('quit\n')
            break
    else:
        break
*# 释放摄像头资源
cap.release()
out.release()
cv2.destroyAllWindows()

图片合成视频操作

#!/usr/bin/python
# -*- coding: utf-8 -*-
import cv2
import numpy as np

#cap=cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*"MPEG")

out = cv2.VideoWriter('c://output.avi',fourcc,20,(1080,960))
i=1
while 1:
    imgname='C:\\Users\\Administrator\\Documents\\Tencent Files\\1039463596\\FileRecv\\image\\'+str(i)+'.jpg'
    print imgname
    img=cv2.imread(imgname)  # 获取图像
    print img.shape
    #if ret == True:
        #frame = cv2.flip(frame, 1)# 在帧上进行操作
    img=cv2.resize(img,(1080,960))
    cv2.imshow("frame",img)  # 显示帧
    i=i+1
    out.write(img) # 保存视频
    if cv2.waitKey(1) == ord('q'):#按下‘q’退出
        print('quit\n')
        break
out.release()
cv2.destroyAllWindows()

你可能感兴趣的:(python-opencv,香蕉派树莓派,linux操作系统,图像处理)