设置捕获设备EmguCV
本文关键字:EmguCV 设置 | 更新日期: 2023-09-27 18:18:48
我正在使用EmguCV的Capture
类从网络摄像头拍摄图像。
根据类的文档(http://www.emgu.com/wiki/files/2.0.0.0/html/18b6eba7-f18b-fa87-8bf2-2acff68988cb.htm), Capture有3个构造函数。
使用public Capture()
应该使用默认相机,它工作正常。
正如我在其中一个例子中看到的,似乎
public Capture(string fileName) //takes a video file as the source for the captures.
最后一个构造函数是
public Capture(int camIndex) //which is supposed to "Create a capture using the specific camera"
我尝试使用最后一个构造函数来允许用户选择设备,以防他有多个摄像头(例如,笔记本电脑中的集成摄像头或插入USB摄像头)
我的问题是我不知道如何获得可用设备的列表。尝试创建索引从0到99的捕获,并尝试捕获一个帧,期望出现异常,但它只捕获了100个黑色图像。此外,当我使用默认相机时,我不知道如何获得他的索引。
帮忙吗?
编辑:有了Shiva的答案中的信息,我得到了这个工作(我把它贴出来供将来参考):
private void onLoad(object sender, RoutedEventArgs e)
{
//Add the image processing to the dispatcher
this.Dispatcher.Hooks.DispatcherInactive += new EventHandler(dispatcherTimer_Tick);
//Get the information about the installed cameras and add the combobox items
DsDevice[] _SystemCamereas = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
Video_Device[] WebCams = new Video_Device[_SystemCamereas.Length];
for (int i = 0; i < _SystemCamereas.Length; i++)
{
WebCams[i] = new Video_Device(i, _SystemCamereas[i].Name, _SystemCamereas[i].ClassID); //fill web cam array
ComboBoxDevices.Items.Add(WebCams[i].ToString());
}
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
if (capture != null)
{
//Capture an image
Image<Bgr, byte> img = capture.QueryFrame();
//Show the image in the window
ImageOriginal.Source = ImageProcessor.ToBitmapSource(img);
}
}
private void ComboBoxDevices_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//If there is already a capture, dispose it
if (capture != null)
{
capture.Dispose();
}
//Get the selected camera
int selectedDevice = ComboBoxDevices.SelectedIndex;
try
{
//Create new capture with the selected camera
capture = new Capture(selectedDevice);
}
catch (Exception excpt)
{
MessageBox.Show(excpt.Message);
}
}
捕获对象可以使用以下代码提供静态文件作为输入
Capture grabber = new Emgu.CV.Capture(@".'..'..'file.avi");//can be relative path or absolute path of the video file.
要查找已连接的网络摄像头列表,需要将类似于DirectShow (DirectShow.Net.dll)的东西导入项目中,并使用以下代码检索已连接的网络摄像头列表。
DsDevice[] _SystemCamereas = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
Video_Device[] WebCams = new Video_Device[_SystemCamereas.Length];
for (int i = 0; i < _SystemCamereas.Length; i++)
{
WebCams[i] = new Video_Device(i, _SystemCamereas[i].Name, _SystemCamereas[i].ClassID); //fill web cam array
Camera_Selection.Items.Add(WebCams[i].ToString());
}
查看此链接以获取完整代码http://www.emgu.com/wiki/index.php?title=Camera_Capture
该列表可以填充到一个组合框中,每个连接的设备可以选择从特定设备检索视频输入。
示例可以在这里找到:http://fewtutorials.bravesites.com/entries/emgu-cv-c/level-2--use-multiple-cameras-in-one-application。
对于你的最后一个问题,默认相机的索引总是为0。因此,要初始化带有默认相机的捕获对象,您必须使用以下代码
Capture grabber = new Emgu.CV.Capture(0);
检查EMGU CV源似乎表明它只是将索引传递给底层OpenCV库,作为cvCreateCameraCapture (int index)函数的一部分。这个函数是…有点乱的#ifdefs,但从我能看到(从注释指出),索引是用来指定你想要的相机,和它应该使用的API。
依次尝试100的倍数;每个都应该使用不同的编解码器,尝试使用第一个相机。这可能是你有一个列出的api编译到你的OpenCV副本中,但在你的系统上不能正常工作。
Edit:往下看,它似乎结束于这个函数调用,它使用MFEnumDeviceSources函数来获取列表。然后,您想要的设备将从该列表中返回(请参阅上面几行getDevice函数)。所以,在我看来,你在评论中提到的对话框是Windows MediaFoundation的一部分,在这种情况下,你可能需要谷歌一下消息的措辞,看看是否有一些更有MF经验的人可以为你指出正确的方向。