4

我正在使用 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);
    }
}
4

2 回答 2

4

捕获对象可用于使用以下代码将静态文件作为输入

 Capture grabber = new Emgu.CV.Capture(@".\..\..\file.avi");//can be relative path or absolute path of the video file.

要查找连接的网络摄像头列表,需要将 Direct Show (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);
于 2013-06-21T19:44:46.477 回答
2

检查EMGU CV 源似乎表明它只是将索引传递给底层 OpenCV 库,作为 cvCreateCameraCapture (int index) 函数的一部分。该函数是......有点乱 #ifdefs,但从我所看到的(以及评论所表明的)来看,索引用于指定您想要的相机以及它应该使用的 API。

尝试连续尝试一百的倍数;每个都应该使用不同的编解码器,尝试使用第一台摄像机。可能是您将列出的 API 之一编译到您的 OpenCV 副本中,但在您的系统上无法正常工作。

编辑:进一步深入研究,它似乎以这个函数调用结束,它使用MFEnumDeviceSources函数来获取列表。然后从该列表中返回您想要的设备(请参阅上面几行的 getDevice 函数)。因此,在我看来,您在评论中提到的对话框是 Windows 的 MediaFoundation 内容的一部分,在这种情况下,您可能想用谷歌搜索消息的措辞,看看是否有一些对 MF 有更多经验的人可以指出您正确的方向。

于 2013-06-21T01:47:11.103 回答