以后争取每天一更,估计写完的时候,我们可以达到写出一个目标追踪的程序,或者微信跳一跳的刷分程序(这个失败了,亲身试过分数提交失败)。接下来进行关于视频的基本操作。这里重点介绍两个函数CV2.VideoCapture()和CV2.VideoRead()函数,看出来了吧,一个是读视频一个是写函数。下面具体介绍一下用法。
import cv2 import numpy as np cap=cv2.VideoCapture(0) fourcc=cv2.VideoWriter_fourcc(*'XVID') out=cv2.VideoWriter('C:/Users/dell/Desktop/output.avi',fourcc,20,(640,480)) while(cap.isOpened()): ret,frame=cap.read() if ret==True: frame=cv2.flip(frame,1) out.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1)&0xFF==ord('q'): break else: break cap.release() out.release() cv2.destroyAllWindows()上面的一段程序实现了,从摄像头拍摄视频并保存到了桌面上 。
解读一下上面的程序。videocapture函数里的参数可以是0,1(这个是可以调用电脑摄像头的或者其他摄像头,也可以是读取其他文件);videowwriter_fourcc函数是视频的格式,现在还看不出它有什么用,不过这是videowriter()的重要参数,但是不要写成CV_FOURCC('M','J','P','G'),这是opencv2.x版本的格式了,现在都是3.x的版本了;viodeowriter的第一个参数是文件的名称位置,第二个参数就是格式了,第三个参数是帧率,第四个参数是文件的大小。
那个while函数是判断摄像头是否打开,然后成功的话保存文件,最后注销摄像头。特别的那个read函数返回两个参数,第一个是bool型的成功返回1,读取失败返回0,第二个参数是每一帧图象。
当我们读取文件的时候只需要把原来的videocapture函数换成相应的路径,再read出来并且展示就好了。
当我们不知道视频的具体信息,要怎样通过opencv得到视频的具体信息呢?具体操作如下:
import cv2 import numpy as np cap=cv2.VideoCapture('C:/Users/dell/Desktop/output.avi') #计算当前位置在视频中是多少毫秒 temp1=cap.get(cv2.CAP_PROP_POS_MSEC) #计算视频的高 temp2=cap.get(cv2.CAP_PROP_FRAME_HEIGHT) #计算视频的宽 temp3=cap.get(cv2.CAP_PROP_FRAME_WIDTH) #得到视频的帧率 temp4=cap.get(cv2.CAP_PROP_FPS) #得到视频的编码方式 temp5=cap.get(cv2.CAP_PROP_FOURCC) #得到视频的总帧数 temp6=cap.get(cv2.CAP_PROP_FRAME_COUNT)就以之前保存的视频为例,我们通过get函数得到了视频的一些基本属性(如果想查看其它属性可以自己查一查文档吧),print一下就好了
之前一直想读取特定帧的视频并显示出来现在参考了几个博客简单的写出了一个,程序如下。
import cv2 import numpy as np import matplotlib.pyplot as plt cap=cv2.VideoCapture('C:/Users/dell/Desktop/output.avi') order=400 count=0 if cap.isOpened(): rect,frame=cap.read() else: rect=False while(rect): rect,frame=cap.read() count+=1 if count==order: cv2.imshow('frame',frame) cv2.waitKey(0) cv2.destroyAllWindows() rect=False最后声明一下,opencv是可以对图象进行处理但是不像PR这种专业,就不要想着利用opencv做一些花里胡哨的东西了。还有到目前为止我们做的东西貌似“没什么用”,的确是这样的,但是所有复杂的函数都会分解这样简单的函数,所以我们要坚持下来啊。下次我会讲解利用opencv进行基本的绘图,go,go,go!