【问题标题】:OpenCV 2.4 in python - Video processingpython中的OpenCV 2.4 - 视频处理
【发布时间】:2012-08-30 16:18:45
【问题描述】:

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

一位朋友向我推荐了 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. 假设我已经准备好我的文本(在一个字符串中)有人可以尝试帮助我开始我的应用程序吗?

谢谢

【问题讨论】:

  • 查看SimpleCV 作为可能的替代方案。
  • 我会试试的,但我已经浏览了他们的网站,看起来文档太少了。而且我不太了解交互式 shell 的内容(我需要使用它吗?我只能通过 python 脚本工作吗?)
  • 我不使用交互式外壳。文档只是为了向您展示函数的存在,但其余的功能是不言自明的。
  • 啊啊啊。简单的 cv 安装包错误地安装了它(我的 2.7.2 中的一些包和新的 2.7.3 python 库中的一些包)

标签: python opencv video-processing


【解决方案1】:

使用 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.) 恐怕我不知道如何读取元数据。如果我发现了,我会告诉你的。我自己寻找视频帧率的 hackish 解决方案是让 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.

【讨论】:

  • 太棒了!这非常接近我的需要。一些问题:1.为什么只能打开 AVI 文件?(当我尝试读取帧的宽度/高度时抛出异常),2.我如何读取文件的元数据(准确地说 - 时间/日期创作和 FPS)3. 为什么生成的视频要大 3 或 4 倍(空间,当然不是帧),4. 我还有哪些字体和样式?
  • 我已经编辑了我的答案以包含您的一些新问题。另请注意,我的原始代码中有一个错误,但现在已修复。请问还有什么不清楚的地方!
  • 嘿,你能帮帮我吗?我不明白视频的音频发生了什么
  • 这种方法不包括音频,因为我们只是在添加文本后将视频的帧写入新文件。可以使用第三方软件从原始视频中提取音频,然后将其添加到新的视频文件中。但是,如果帧速率不同,这将失败,因为它会导致音频不同步。 This question 展示了它是如何完成的,但恐怕它是在 C++ 中的。也许你可以移植它?
  • 请注意,除非您也有 'import cv2.cv as cv' 编解码器加载为 'fourcc=cv2.cv.CV_FOURCC('i','Y', 'U', 'V ')'
【解决方案2】:

使用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

【讨论】:

    猜你喜欢
    • 2017-07-28
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2012-05-14
    • 2012-09-08
    • 2020-12-20
    • 2017-04-07
    相关资源
    最近更新 更多