2017-10-16 76 views
0

イメージングアプリケーションで使用するAccord.NET Framework(https://github.com/accord-net/framework/)を評価しています。現時点では基本的な要件がいくつかあります.USBカメラからのビデオをキャプチャしてUIに表示し、すべてのカメラのプロパティを表示/変更します。Accord.Video.DirectShowを使用してカメラの解像度を取得する

Accord.VideoDirectShow.VideoCaptureDevice.DisplayPropertyPageは、明るさ、コントラスト、色相などのカメラプロパティを表示するのにはうまく機能しますが、使用可能なカメラ解像度は表示されません。

Accord.VideoDirectShow.VideoCaptureDevice.VideoCapabilitiesは1つの解像度のみを返していますが、私はさらにいくつかのことを期待していました。

私はVideoCapx(http://videocapx.com/)ActiveXコントロールを試し、そのShowVideoFormatDlgメソッドを使用して、使用可能な解像度、フレームレートなどをすべて表示するダイアログを表示できます。これは製造元から提供され、OLE \ COM経由でアクセスできるダイアログです。私が探しているのは、.NET経由で、Accordフレームワークを通してうまくいけば、これにアクセスする方法です。

変換フィルタのプロパティが追加の解像度であることがわかっていますが、.NETのDirectShowインターフェイスとCOMインターフェイスが初めてのため、いくつかのポインタを探しています。

答えて

2

.NET用のDirectShowコードをラップするのに使用します。 DirectShowでは/ 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は1つの解像度しか返しません。これはカメラにとって最高です...私の疑惑は、デバイスドライバのフォーマットダイアログを表示するときに表示される他の解像度は、圧縮フィルタ。私はこれらをプログラムで取得/設定する方法が不明です。何か案は? – Cat

+0

私の経験では、DirectShowソースフィルタは、デバイスによってサポートされている解像度またはフレームレートまたはサイズを実装するとは限りません。 DirectShowのソースフィルタの機能を簡単に検証するために、私はカスタムコードを書く前にグラフ編集でそれを行うのに使っています。 ダウンロードしてインストールし、ソースフィルタを追加し、キャプチャピンのプロパティを検証してサポートされているソース機能を調べます。 – Bafro

関連する問題