2017-10-16 475 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