2017-10-16 25 views
0

이미징 응용 프로그램에서 사용할 Accord.NET 프레임 워크 (https://github.com/accord-net/framework/)를 평가 중입니다. 지금은 몇 가지 기본 요구 사항이 있습니다 - USB 카메라에서 비디오를 캡처하여 UI에 표시하고 모든 카메라 속성을보고/변경하십시오.Accord.Video.DirectShow를 사용하여 카메라 해상도 얻기

Accord.Video.DirectShow.VideoCaptureDevice.DisplayPropertyPage는 밝기, 대비, 색조 등과 같은 카메라 속성을 표시하는 데 적합하지만 사용 가능한 카메라 해상도는 표시하지 않습니다.

Accord.Video.DirectShow.VideoCaptureDevice.VideoCapabilities는 하나의 해상도 만 반환하지만 몇 가지 더 예상하고 있습니다.

VideoCapx (http://videocapx.com/) ActiveX 컨트롤을 사용하고 ShowVideoFormatDlg 메서드를 사용하여 모든 사용 가능한 해상도, 프레임 수 등을 표시하는 대화 상자를 표시 할 수 있습니다.이 대화 상자는 제조업체에서 제공하고 OLE \ COM을 통해 액세스 할 수 있음을 알고 있습니다. 내가 찾고있는 것은 .NET을 통해 이것을 액세스하는 방법이다. 아마 Accord 프레임 워크를 통해 가능할 것이다.

추가 해상도가 변환 필터의 속성 일 수도 있지만 DirectShow 및 .NET의 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가 카메라에서 가장 높은 해상도 하나만 반환합니다 ... 따라서 장치 드라이버 형식 대화 상자를 표시 할 때 표시되는 다른 해상도는 실제로 다음과 같이 제공됩니다. 압축 필터. 나는 프로그래밍 방식으로 이것들을 얻거나 설정하는 방법을 확신하지 못한다. 어떤 아이디어? – Cat

+0

내 경험으로는 DirectShow 소스 필터가 항상 장치에서 지원하는 해상도 나 프레임 속도 또는 크기를 구현하지는 않습니다. DirectShow 원본 필터 기능을 쉽게 확인하기 위해 사용자 지정 코드를 작성하기 전에 Graph 편집을 사용합니다. 다운로드하고 설치하고 소스 필터를 추가 한 다음 캡처 핀 속성을 확인하여 지원되는 소스 기능을 확인하십시오. – Bafro