项目:在视频的每一帧上添加一个运行日期/时间戳。 (数码摄像机的结果,我的父亲问我如何将时间戳(毫秒分辨率)永久添加到视频中。
一位朋友将我指向opencv(实际上是emgucv),并且由于我的偏好,我在python中尝试使用opencv。
文档很蹩脚,我甚至很难(只花了5个小时左右)来安装软件包。 来源:
我正在使用Windows 7 x64,所以我不得不降级我的python以使用numpy(win64没有numpy版本)
使用PyCharm IDE。
生成的安装让我得到了文件C:\ Python27 \ Lib \ site-packages \ cv2.pyd
我正在尝试找到开始使用的文档,但我很困惑并且不知道从哪里开始,所有的例子都令人困惑 - 即:
我的问题:
由于
答案 0 :(得分:18)
使用OpenCV和Python,您的任务应该相对容易完成。您似乎是OpenCV的新手,所以我会尽力保持我的解释,但随时可以询问您是否需要明确。
我不确定您是从实时摄像机视频输入中获取数据,还是正在处理录制的录像。无论哪种方式......
获取数据。 如果使用实时Feed:
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 :(得分: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