Python+Opencv对视频流进行手势估计——基于caffe

项目中想要看看视频处理的效果,所以基于原来的处理单张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 = (576, 324)
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()
扫描二维码关注公众号,回复: 2673955 查看本文章

二、加入Caffe Python接口代码

这里把自己写好的调用模型的代码放到上面预留的地方就好,注意做好pre-processing和post-processing,同时图片尺寸要和写入视频的大小保持一致。

三、run it!

python demo.py --video ./video.mov

源码:待添加

References:  http://python.jobbole.com/81593/

猜你喜欢

转载自blog.csdn.net/BockSong/article/details/81200391
今日推荐