Python中的OpenCV 2.4 - 视频处理

Yoa*_* R. 8 python opencv video-processing

项目:在视频的每一帧上添加运行日期/时间戳.(数码摄像机的结果,我的父亲问我如何将时间戳(毫秒分辨率)永久添加到视频中.

一位朋友把我指向opencv(实际上是emgucv),由于我的喜好,我在python中尝试了opencv.

文档是蹩脚的,我甚至很难(只花了5个小时左右)来安装软件包.资料来源:

我正在使用Windows 7 x64,所以我不得不降级我的python以使用numpy(win64没有numpy版本)

使用PyCharm IDE.

生成的安装让我得到了文件C:\ Python27\Lib\site-packages\cv2.pyd

我试图找到开始使用的文档,但我很困惑,并且不知道从哪里开始,所有的例子都令人困惑 - 即:

我的问题:

  1. 难道我做错了什么?这不是安装opencv的方法吗?
  2. 我在哪里可以找到好的文档?
  3. 假设我准备好了我的文本(在一个字符串中)有人可以尝试帮助我开始我的应用程序吗?

谢谢

hjw*_*ide 18

使用OpenCV和Python,您的任务应该相对容易完成.看来你是OpenCV的新手,所以我会尝试彻底解释我的解释,但随意问你是否需要任何清晰度.

我不确定您是从实时摄像机视频源获取数据,还是正在处理录制的录像.无论哪种方式...

获取数据.如果使用实时Feed:

capture = cv2.VideoCapture(0)
Run Code Online (Sandbox Code Playgroud)

如果使用录制的镜头:

capture = cv2.VideoCapture("your_reading_file.avi")
Run Code Online (Sandbox Code Playgroud)

初始化视频编写者.查看这个问题以获得有关编解码器的帮助 - 找到一个可用的编解码器并非易事.我也使用Windows 7 x64,下面提到的编解码器是唯一适合我的编解码器.此外,fps尽可能将变量设置为接近实际输入视频帧速率 - 一旦开始写入帧,就无法更改它.

flag, frame = capture.read() # **EDIT:** to get frame size
width = np.size(frame, 1) #here is why you need numpy!  (remember to "import numpy as np")
height = np.size(frame, 0)
writer = cv2.VideoWriter(filename="your_writing_file.avi", 
fourcc=cv2.cv.CV_FOURCC('I', 'Y', 'U', 'V'), #this is the codec that works for me
fps=15, #frames per second, I suggest 15 as a rough initial estimate
frameSize=(width, height))
Run Code Online (Sandbox Code Playgroud)

处理此数据并添加文本.最后,将编辑的帧写入视频文件.

while True:
    flag, frame = capture.read() #Flag returns 1 for success, 0 for failure. Frame is the currently processed frame

    if flag == 0: #Something is wrong with your data, or the end of the video file was reached
        break 
    x = width/2
    y = height/2 #change to the desired coordinates
    text_color = (255,0,0) #color as (B,G,R)
    cv2.putText(frame, "your_string", (x,y), cv2.FONT_HERSHEY_PLAIN, 1.0, text_color, thickness=1, lineType=cv2.CV_AA)

    writer.write(frame) #write to the video file
Run Code Online (Sandbox Code Playgroud)

就如此容易!我几乎每天都使用上面的代码将文本写入视频文件,所以它绝对有效.我可以预见的唯一潜在问题是编解码器,遗憾的是我不太了解.我希望这可以解决您的问题,随时提出更多问题.

编辑:您的评论的问题的答案.

1.)据我所知,你只能使用.avi,因为你必须使用OpenCV的未压缩格式.我恐怕不知道使用其他(压缩)格式.也许您可以使用第三方程序进行转换前/后转换?frame异常的原因是我的错误,我编辑了答案以包括缺失的行.

2.)我恐怕我不知道如何阅读元数据.如果我发现我会告诉你.我自己用于查找视频帧率的hackish解决方案是让OpenCV运行一次视频,使用该Time模块计算平均帧速率.然后可以在编写视频文件时使用该估计.

3.)我发现得到的视频的大小可能与原始视频的大小有很大不同,具体取决于几个因素,最重要的是所选视频fps与实际原始帧速率的接近程度.

4.)至于其他字体,有几种可用.我可以向您推荐这个问题,以便快速了解.以下是相关文档:

fontFace – Font type. One of FONT_HERSHEY_SIMPLEX, 
FONT_HERSHEY_PLAIN, 
FONT_HERSHEY_DUPLEX, 
FONT_HERSHEY_COMPLEX, 
FONT_HERSHEY_TRIPLEX, 
FONT_HERSHEY_COMPLEX_SMALL, 
FONT_HERSHEY_SCRIPT_SIMPLEX, or 
FONT_HERSHEY_SCRIPT_COMPLEX, 
where each of the font ID’s can be combined with FONT_HERSHEY_ITALIC to get the slanted letters.
Run Code Online (Sandbox Code Playgroud)