2012-09-05 63 views
8

项目:在视频的每一帧添加运行日期/时间戳。 (数码摄像机的结果,和我的父亲问我怎么可以添加时间戳(以毫秒分辨率)永久的视频。python中的OpenCV 2.4 - 视频处理

一位朋友指出我opencv(emgucv其实),并因为我的喜好我想我的运气在Python OpenCV的

文档是个瘸子,我甚至很难(把我当成5个小时左右)刚刚安装的软件包 来源:。

我的工作在Windows 7 64位,所以我不得不降级我的蟒蛇与numpy的工作(不numpy版本为win64)

使用PyCharm IDE。

这样得到的安装让我有文件C:\ Python27 \ LIB \站点包\ cv2.pyd

我试图找到文档开始有工作,但我很迷茫,没有线索从哪里,所有的例子开始感到困惑 - 即:

我的问题:

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

感谢

+1

考查[SimpleCV](http://simplecv.org/docs/)和作为一种可能的替代。 – Blender

+0

我会尝试一下,但我已经浏览了他们的网站,看起来文档太少。我真的不明白交互式shell的用处(我需要使用它吗?我只能通过python脚本工作吗?) –

+0

我不使用交互式shell。文档就是为了向您展示函数的存在,但其余的功能都是不言自明的。 – Blender

回答

18

你的任务应该是比较容易使用的OpenCV和Python来完成。看起来你是OpenCV的新手,所以我会尽量让我的解释彻底,但随时问你是否需要任何清晰。

我不确定您是从实时相机视频供稿中获取数据,还是后期处理录制的素材。无论哪种方式...

获取数据。 如果使用活饲料:

capture = cv2.VideoCapture(0) 

如果使用记录的片段:

capture = cv2.VideoCapture("your_reading_file.avi") 

初始化视频作家。查看at this question以获得编解码器的帮助 - 发现工作编解码器不是微不足道的。我也使用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)) 

处理这些数据,并添加文字。最后,将编辑后的帧写入视频文件。

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 

就这么简单!我使用上面的代码几乎每天都会将文本写入视频文件,所以它绝对有效。我可以预见的唯一的潜在问题是编解码器,我不知道这些编解码器有多少。我希望这可以解决你的问题,随时提出更多问题。

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

1.)据我所知,你只能使用.avi,因为你必须使用OpenCV的非压缩格式。恐怕我没有使用其他(压缩)格式的知识。也许你可以使用第三方程序做前/后转换? frame例外的原因是我的错误,我编辑了包含缺失行的答案。

2.)恐怕我不知道如何读取元数据。如果我发现我会让你知道。我自己的寻找视频帧速率的方法是让OpenCV运行一次,使用Time模块计算平均帧率。在编写视频文件时可以使用此估计值。 3)我发现生成的视频的尺寸可能与原始尺寸有很大的不同,具体取决于几个因素,最重要的是选择的fps与实际原始帧率有多接近。

4.)至于其他字体,有几种可用。我可以参考this question快速浏览。下面是相关文档:

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. 
+0

太棒了!这非常接近我所需要的。一些问题:1.为什么只能打开AVI文件?(当我尝试读取帧的宽度/高度时抛出异常),2.我如何读取文件的元数据(并确切地说 - 时间/日期创作和FPS)3.为什么产生的视频是3或4倍大(空间,当然不是框架),4.我对字体有更多的字体,样式? –

+0

我编辑了我的答案,包括一些新的问题。还请注意,我的原始代码中存在错误,但现在已修复。请问有没有什么不清楚的地方! – casper

+0

嘿,你能帮我吗?,我不明白视频音频会发生什么 –

1

用于hachoir-metadata读取视频文件的元数据(包括帧率,高度和宽度

进口:

from hachoir_core.error import HachoirError 
from hachoir_core.cmd_line import unicodeFilename 
from hachoir_parser import createParser 
from hachoir_core.tools import makePrintable 
from hachoir_metadata import extractMetadata 
from hachoir_core.i18n import getTerminalCharset 
from hachoir_metadata.metadata_item import QUALITY_BEST 

功能:

def metaDataFile(filePath): 
    filename, realname = unicodeFilename(filePath), filePath 
    parser = createParser(filename, realname) 
    try: 
     metadata = extractMetadata(parser, QUALITY_BEST) 
    except HachoirError, err: 
     print "Metadata extraction error: %s" % unicode(err) 
     metadata = None 
    if not metadata: 
     print metadata 
     print "Unable to extract metadata" 
     exit(1) 
    return metadata 

用法:

metadata = metaDataFile(videoPath) 
width = metadata.get('width') 
height = metadata.get('height') 
fps = metadata.get('frame_rate') 

看到相关的属性:

for data in sorted(metadata): 
    if len(data.values) > 0: 
     print data.key, data.values[0].value