使用DirectShow和Visual C ++外部硬件触发USB3.0相机

时间:2015-01-30 13:51:33

标签: visual-c++ triggers camera event-handling directshow

使用外部硬件触发兼容UVC的USB3.0相机,我想在Visual C ++代码中使用Directshow获取静态图像。使用相机制造商提供的API,我们可以将相机设置为外部触发模式。当相机处于主模式(“自由运行模式”而没有外部触发)时,我们在DirectShow VC ++程序中获得正确的事件通知代码。但是,在外部触发模式下从外部触发摄像机时,我们无法获得正确的事件通知代码,如下所述。

要获取正在运行的过滤器图形的事件接口IMediaEventEx * pEvent的事件通知代码,我们调用

hr = pEvent->WaitForCompletion(INFINITE, &evCode);

while (hr = pEvent->GetEvent(&evCode, &param1, &param2, 0), SUCCEEDED(hr))
  {
    hr = pEvent->FreeEventParams(evCode, param1, param2);

    if ((evCode == EC_COMPLETE))
    {   
    break;
    }
  }

在主模式下(无外部触发),我们获取evCode的事件通知代码EC_COMPLETE(即所有数据都已渲染),并从我们可以调用的相机中获取图像数据

hr = pSGrabber->GetCurrentBuffer(&cbBufSize, NULL); 

hr = pSGrabber->GetCurrentBuffer(&cbBufSize, (long*)pBuffer);

这里pSGrabber是Sample Grabber Filter的ISampleGrabber接口。 但是,在evCode的外部触发模式下,我们只获取事件通知代码EC_ACTIVATE,因此我们无法获取任何图像数据。还可以注意到,通过静态Pin的IAMVideoControl接口,我们为外部触发设置了标志

hr = pAMVidControl->SetMode(pPinStill, VideoControlFlag_ExternalTriggerEnable);

其中IPin * pPinStill是指向静止Pin的指针。

我们知道我们使用的外部触发脉冲足以触发相机,因为使用商业软件我们成功地从外部触发相机。因此,我认为这个问题与DirectShow编程有关。有没有人在使用外部触发相机时在DirectShow中获取图像数据的经验?或者指出一些信息来源?

非常感谢。

0 个答案:

没有答案