项目中想要看看视频处理的效果,所以基于原来的处理单张RGB图像的程序,参考网上的例子,写了这样一个脚本。
一、编写视频处理框架
首先载入需要的包,然后设置从参数读入视频路径。
# 导入所需软件包
import argparse
import datetime
import imutils
import time
import cv2
# 创建参数解析器并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", help="Path of the video")
args = vars(ap.parse_args())
然后编写读写视频的操作代码。openCV提供了VideoCapture类和VideoWriter类来支持各种格式的视频文件。支持的格式类型会因系统的不同而变化,但应该都支持AVI格式。在到达视频文件末尾之前,VideoCapture类可通过read()函数来获取新的帧,每帧都是一幅基于BGR格式的图像。要为VideoWriter类的构造函数指定视频文件名,这个文件名对应的文件若存在,会被覆盖。也必须指定视频编解码器。编解码器的可用性根据系统不同而不同。下面是一些常用选项:
cv2.VideoWriter_force('I', '4', '2', '0'):该选项是一个未压缩的YUV颜色编码,是4:2:0色度子采样。这种编码有很好的兼容性,但会产生较大文件,文件扩展名为.avi。
cv2.VideoWriter_force('P', 'I', 'M', '1'):该选项是MPEG-1编码类型,文件扩展名为.avi。
cv2.VideoWriter_force('X', 'V', 'I', 'D'):该选项是MPEG-4编码类型,如果希望得到的视频大小为平均值,推荐使用此选项,文件扩展名为.avi。
经过测试,这里选用MPEG-4编码类型效果比较好。
# 如果video参数为None,那么我们从摄像头读取数据
# 否则我们读取一个视频文件
if args.get("video", None) is None:
camera = cv2.VideoCapture(0)
time.sleep(0.25)
else:
camera = cv2.VideoCapture(args["video"])
# 准备写入视频
fps = camera.get(cv.CAP_PROP_FPS)
size = (int(cap.get(3)), int(cap.get(4)))
writer = cv.VideoWriter("demo.avi", cv.VideoWriter_fourcc('X', 'V', 'I', 'D'), fps, size)
# 初始化视频流的第一帧
firstFrame = None
流程逻辑,处理每一帧直到结束;同时把每张处理后的图片保存下来。
while True:
(grabbed, frame) = camera.read()
if not grabbed:
break
if firstFrame is None:
firstFrame = gray
continue
# # # # # # # # # # # # # # # # #
# Reserved for Pose Estimation #
# # # # # # # # # # # # # # # # #
# 计算并显示FPS
text = round(1.0 / (time.time() - start_time), 2)
cv.putText(frame, "FPS: {}".format(text), (10, 20),
cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
# 显示当前日期及时间
cv.putText(frame, datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"),
(10, frame.shape[0] - 10), cv.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
cv.imwrite("../videoshots/pic/frame" + getstring(index) + ".png" , frame)
writer.write(frame)
index += 1
key = cv.waitKey(1) & amp;
if key == ord("q"):
break
# 显示处理进度
if index % 5 == 0:
print "Progress: ", math.floor(index / 1.63), " % Spend time: ", round(time.time() - totalstarttime, 2), " s"
如果有GUI界面,可以去掉最后的注释,直接看效果。
print "Progress: 100 % Spend time: ", round(time.time() - totalstarttime, 2), " s"
#camera.release()
#cv.destroyAllWindows()
二、加入Caffe Python接口代码
这里把自己写好的调用模型的代码放到上面预留的地方就好,注意做好pre-processing和post-processing,同时图片尺寸要和写入视频的大小保持一致。
三、run it!
python demo.py --video ./video.mov
源码:待添加
References: http://python.jobbole.com/81593/