python中的OpenCV 2.4-视频处理
项目:在视频的每一帧上添加一个运行日期/时间戳。(这是数码摄像机的结果,我父亲问我他如何能将时间戳(毫秒分辨率)永久地添加到视频中 一位朋友指给我看opencv(实际上是emgucv),由于我的偏好,我用python试试opencv 文档是蹩脚的,我甚至花了很长时间(花了我大约5个小时)才安装这个软件包。 资料来源:python中的OpenCV 2.4-视频处理,python,opencv,video-processing,Python,Opencv,Video Processing,项目:在视频的每一帧上添加一个运行日期/时间戳。(这是数码摄像机的结果,我父亲问我他如何能将时间戳(毫秒分辨率)永久地添加到视频中 一位朋友指给我看opencv(实际上是emgucv),由于我的偏好,我用python试试opencv 文档是蹩脚的,我甚至花了很长时间(花了我大约5个小时)才安装这个软件包。 资料来源: OpenCV 2.4(柳树车库): Numpy(我甚至不知道它做什么或为什么需要): 活动Python 2.7: 我在Windows7x64上工作,所以我不得不降级python
- OpenCV 2.4(柳树车库):
- Numpy(我甚至不知道它做什么或为什么需要):
- 活动Python 2.7:
- “官方”文档适用于c/c++,没有python参考:
- python的示例似乎合理,但与我需要的不太接近:
- 示例接近我需要的内容,但似乎不符合逻辑(cv而不是cv2??):
谢谢使用OpenCV和Python,您的任务应该相对容易完成。您似乎是OpenCV的新手,因此我将尝试详细解释,但请随时询问您是否需要澄清 我不确定你是从现场摄像机视频源获取数据,还是对录制的片段进行后期处理。无论哪种方式 获取数据。 如果使用实时提要:
capture = cv2.VideoCapture(0)
如果使用录制的镜头:
capture = cv2.VideoCapture("your_reading_file.avi")
初始化视频编写器。查找有关编解码器的帮助-查找工作的编解码器并非易事。我也在使用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
模块计算平均帧率。然后,可以在写入视频文件时使用此估计值
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
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.
用于读取视频文件元数据(包括帧率、高度和宽度)
进口:
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
寻找一个可能的替代方案。我会尝试一下,但我已经浏览了他们的网站,看起来文档太少了。我不太理解交互式shell(我需要使用它吗?我只能通过python脚本工作吗?)我不使用交互式shell。文档只是向您展示函数的存在,但其余的功能都是不言自明的。ahhh。simple cv installation pack错误地安装了它(my 2.7.2中的一些软件包和新的2.7.3 python库中的一些软件包)太好了!这非常接近我的需要。一些问题:1.为什么只有AVI文件才能打开?(当我尝试读取帧的宽度/高度时抛出异常),2.我如何读取文件的元数据(确切地说,是创建时间/日期和FPS)3.为什么生成的视频要大3到4倍(空间,当然不是帧),4.我的字体还有哪些字体和样式?我已经编辑了我的答案,包括了你的一些新问题。请注意,我的原始代码中有一个错误,但现在已经修复。请询问是否还有什么不清楚的地方!嘿,你能帮我吗?我不明白视频的音频是怎么回事。这种方法没有s不包括音频,因为我们只是在添加文本后将视频的帧写入新文件。可以使用第三方软件从原始视频中提取音频,然后将其添加到新视频文件。但是,如果帧速率不同,这将失败,因为这将导致音频不同步。sHOWS如何做到这一点,但恐怕它是在C++中。也许你可以把它端口?抬头,除非你也有“进口CV2.CV作为CV”。编解码器被加载为“FuccC= CV2.CVCVY-FECC(‘i’,‘y’,‘u’,’v’’”。