我正在开发一个处理视频输入的Windows服务,并将感兴趣的结果发送到一个单独的平台。我不需要在这种情况下显示帧。我在获取正确的相机输入时遇到问题。
我想保存从EMGU捕获对象检索到的Bitmap。为了确保捕获实际上是在读取视频流,我将位图保存到文件中,如下所示:
Mat frame = mCapture.QueryFrame();
Template = frame.Bitmap;
Template.Save("frozen.jpg");
捕获初始化如下:
CvInvoke.UseOpenCL = false;
int index = int.Parse(ConfigurationManager.AppSettings["Index"]);
mCapture = new Capture(index);
一个测试平台是运行64位Windows 10的联想笔记本电脑,内置摄像头和第二个通过USB端口连接的摄像头。感兴趣的输入是第二个相机。但是,无论我用什么索引打开Capture对象,输入都来自内置摄像头。
另一个平台是Meego Pad,运行32位Windows 10,附带相同的相机。在这种情况下,我只是将空白帧作为视频输入。对于这两个平台,运行相机应用程序会按预期显示视频输入。我初始化Capture对象有什么问题?
进一步调查显示......
首先,我使用了错误的索引来创建捕获,这样就造成了一些混乱。但随后会出现更多混乱。
当我在事件委托中调用QueryFrame()方法时,如this simple example所示,我成功从相机中检索帧。示例代码如下所示:
Application.Idle += new EventHandler(delegate(object sender, EventArgs e)
{ //run this until application closed (close button click on image viewer)
viewer.Image = capture.QueryFrame(); //draw the image obtained from camera
});
viewer.ShowDialog(); //show the image viewer
当我在不同的线程中调用相同的方法时(响应通信事件),我得到一个空图像。在抓握的手上,当我在计时器回调中调用该方法时,我得到了正确的图像。
我不会把这个称为关闭,因为我仍然想知道为什么QueryFrame()在某些线程中正常运行,而在其他线程中却没有。但是,我可以解决这个问题,所以问题现在主要是学术性的。