代码之家  ›  专栏  ›  技术社区  ›  Cat

使用Accord获取摄像机分辨率。视频DirectShow公司

  •  0
  • Cat  · 技术社区  · 7 年前

    我正在评估协议。NET框架( https://github.com/accord-net/framework/ )用于成像应用。目前,我有一些基本要求-从USB摄像机捕获视频,显示在用户界面上,并查看/更改所有摄像机属性。

    一致视频DirectShow。视频捕获设备。DisplayPropertyPage可以很好地显示摄像机属性,如亮度、对比度、色调等,但不显示可用的摄像机分辨率。

    http://videocapx.com/ )ActiveX控件并使用其ShowVideoFormatDlg方法,我可以显示一个对话框,其中显示所有可用的分辨率、帧速率等。我知道这是制造商提供的一个对话框,可以通过OLE COM访问。我正在寻找的是一种通过访问此的方式。NET,希望通过协议框架。

    我知道其他分辨率可能是转换过滤器的属性,但我对中的DirectShow和COM接口不熟悉。NET,所以我正在寻找一些指针。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Bafro    7 年前

    您是否尝试过使用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