2010-06-05 56 views
1

从我以前的问题来看,我试图建立一个简单的眼动仪。决定从Linux版本开始(运行Ubuntu)。同步屏幕录像(ffmpeg)和从网络摄像头捕捉(OpenCV)

要完成此任务,您应该组织屏幕录像和网络摄像头捕捉,以使来自两个流的帧完全相互匹配,并且每个帧中都有相同数量的帧。

Screencasting fps完全取决于相机的fps,因此每次我们从网络摄像头获取图像时,我们都可能抓住屏幕框架并保持高兴。但是,所有用于快速截屏的工具,例如ffmpeg,都会返回.avi文件,并要求已知fps已启动。

另一方面,Java + Robot或ImageMagick等工具似乎需要大约20ms才能返回.jpg任务的截图。但是可能会在每次抓取摄像头帧后立即请求并提供所需的同步。

所以子问题是:

  1. 是否单个会话期间USD摄像机的帧率变化?
  2. 有没有提供逐帧快速屏幕录像的工具?
  3. 有没有什么办法可以让ffmpeg只有在程序启动这个请求时才会向.avi文件推送一个新的帧?

对于我的任务,我可以使用C++或Java。

我实际上是一个界面设计师,而不是驱动程序员,而且这个任务看起来很低级。我会很感激任何建议和提示!

+0

你的意思是FPS(每秒帧数),不FSP,正确吗? – metaliving 2010-06-05 16:41:27

+0

当然,谢谢! :) – lyuba 2010-06-05 17:51:23

+0

和USB而不是美元? – 2013-04-24 06:26:27

回答

1

使用OpenCV HighGUI的cvGetCaptureProperty(CvCapture* capture, int property_id)函数与property_id = CV_CAP_PROP_FPS来确定您的网络摄像头捕获的每秒帧数。

使用例:

CvCapture *capture = 0; 
double fps = 0.0; 

capture = cvCaptureFromCAM(0); 
fps = cvCaptureProperty(capture, CV_CAP_PROP_FPS); 
+0

好主意,但是如何在这种情况下推荐组织同时完全匹配捕获? 我应该使用两个线程吗?或者刚收到网络摄像头的第一帧后立即初始化ffmpeg capturer,我们知道fps? 欢迎任何建议,谢谢! – lyuba 2010-06-05 17:53:30

+0

不确定ffmpeg,但你可以使用'cvCreateVideoWriter()'函数创建一个包含视频源的.avi文件,在每个循环中用'cvGrabFrame()'函数抽取一个帧,并用' cvWriteFrame()'。在同一个循环中,您可以从屏幕提取图像并将其写入另一个视频文件。我相信,如果您将屏幕截图的FPS设置为与相机相同,您将实现同步。 – metaliving 2010-06-05 20:53:24

+0

Metaliving,我试过了你的方法,但不幸的是,CV_CAP_PROP_FPS属性只能在Windows中工作,从OpenCV文档开始。错误是: HIGHGUI错误:V4L2:不支持获取属性#5。 我在Ubuntu下工作,也希望我的项目是跨平台的,所以必须寻求另一种方式来做到这一点。 顺便说一句,你的代码有一个错误:那里应该有cvGetCaptureProperty(不是cvCaptureProperty)。 反正,感谢您的意见! – lyuba 2010-06-06 15:00:22