2017-10-16 466 views
0

我正在评估用于成像应用程序的Accord.NET框架(https://github.com/accord-net/framework/)。目前我有一些基本要求 - 从USB摄像头捕捉视频以显示在用户界面上并查看/更改所有摄像头属性。使用Accord.Video.DirectShow获取相机分辨率

Accord.Video.DirectShow.VideoCaptureDevice.DisplayPropertyPage可以很好地用于示出照相机的特性,如亮度,对比度,色调等,但并没有显示可用摄像机的分辨率。

Accord.Video.DirectShow.VideoCaptureDevice.VideoCapabilities仅返回一个分辨率,但我期待着更多。

我曾尝试VideoCapx(http://videocapx.com/)ActiveX控件和使用它的方法ShowVideoFormatDlg我可以显示一个对话框,其中显示了所有可用的分辨率,帧率等我理解,这是由制造商提供,并通过OLE \ COM访问的对话框。我正在寻找的是通过.NET访问这种方式,希望通过雅阁框架。

我知道额外的分辨率可能是转换过滤器的属性,但我是.NET中的DirectShow和COM接口的新手,所以我正在寻找一些指针。

回答

2

我用来包装.NET的DirectShow代码。 确实使用DirectShow可以获取,设置和检索a/v源功能。 您是否尝试过使用IAMStreamConfig视频界面在某些捕获和压缩过滤器上设置输出格式?

我使用此代码来获取解决方案并将其设置在不同的来源。 其中m_pVCap:源过滤

hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved, 
       m_pVCap, IID_IAMVideoCompression,(void **)&m_pVC); 

    if (hr != S_OK) 
     hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, 
       m_pVCap,IID_IAMVideoCompression,(void **)&m_pVC); 

    // !!! What if this interface isn't supported? 
    // we use this interface to set the frame rate and get the capture size 
    hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved, 
       m_pVCap, IID_IAMStreamConfig, (void **)&m_pVSC); 
    if (hr != NOERROR) 
    { 
     hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, 
      m_pVCap, IID_IAMStreamConfig,(void **)&m_pVSC); 
     if (hr != NOERROR) 
     { 
      LogDXError(hr, false, FILELINE); 
     } 
    } 

要获得电流源格式

hr = m_pVSC->GetFormat(&pmt); 
    // DV capture does not use a VIDEOINFOHEADER 
    if (hr == NOERROR) 
    { 
     if (pmt->formattype == FORMAT_VideoInfo) 
     { 
      VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *)pmt->pbFormat; 

      pvi->AvgTimePerFrame = (LONGLONG)(10000000/m_FrameRate); 

      hr = m_pVSC->SetFormat(pmt); 

      if (hr != NOERROR) 
       (NotifyNewError) (FILELINE, "", LOG_ALL, ERR_GRAVE, false, 
        "Cannot set frame rate for capture"); 

      hr = m_pVSC->GetFormat(&pmt); 
      pvi = (VIDEOINFOHEADER *)pmt->pbFormat; 

      pvi->bmiHeader.biWidth = g_SizeOutput.cx; 
      pvi->bmiHeader.biHeight = g_SizeOutput.cy; 
      pvi->bmiHeader.biSizeImage = DIBSIZE(pvi->bmiHeader); 

      hr = m_pVSC->SetFormat(pmt); 
      if (hr != NOERROR) 
      { 
       char ErrTxt[MAX_ERROR_TEXT_LEN];       
       AMGetErrorText(hr, ErrTxt,MAX_ERROR_TEXT_LEN); 
       wsprintf(szError, "Error %x: %s\nCannot set frame rate (%d)for 
        prev", hr, ErrTxt,m_FrameRate); 
       (NotifyNewError)(FILELINE, "", LOG_ALL, ERR_GRAVE, false, szError);     
      } 

      DeleteMediaType(pmt); 
     } 

要获得来源的能力,你可以使用:

IAMStreamConfig::GetNumberOfCapabilities and then IAMStreamConfig::GetStreamCaps 
+0

https://msdn.microsoft.com/en -us/library/windows/desktop/dd319784(v = vs.85).aspx – Bafro

+0

感谢您的回复。使用C#.NET和Accord.Video.DirectShow库,IAMStreamConfig.GetNumberOfCapabilities只返回一个分辨率 - 相机的最高分辨率......所以我怀疑显示设备驱动程序格式对话框时显示的其他分辨率实际上是由一个压缩过滤器。我不确定如何以编程方式获取/设置。有任何想法吗? – Cat

+0

对于我的经验DirectShow源过滤器不总是实现任何分辨率或设备支持的帧速率或大小。 为了轻松验证DirectShow源代码过滤器的功能,我使用它来编辑图形,然后编写自定义代码。 只需下载并安装它,添加源过滤器并查看捕获引脚属性以验证支持的源功能。 – Bafro