使用 Accord.Video.DirectShow 获取相机分辨率
Getting Camera Resolutions Using Accord.Video.DirectShow
我正在评估 Accord.NET 框架 (https://github.com/accord-net/framework/) 在成像应用程序中的使用。目前我有一些基本要求 - 从 USB 摄像头捕获视频以显示在 UI 和 view/change 所有摄像头属性上。
Accord.Video.DirectShow.VideoCaptureDevice.DisplayPropertyPage 可以很好地显示相机属性,例如亮度、对比度、色调等,但不显示可用的相机分辨率。
Accord.Video.DirectShow.VideoCaptureDevice.VideoCapabilities 只返回一个分辨率,但我期待更多。
我已经尝试了 VideoCapx (http://videocapx.com/) ActiveX 控件并使用其 ShowVideoFormatDlg 方法我可以显示一个对话框,其中显示所有可用的分辨率、帧速率等。我知道这是制造商提供的对话框并访问通过 OLE\COM。我正在寻找一种通过 .NET 访问它的方法,希望通过 Accord 框架。
我知道额外的分辨率可能是转换过滤器的属性,但是我对 .NET 中的 DirectShow 和 COM 接口不熟悉,所以我正在寻找一些指导。
我用于包装 .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
我正在评估 Accord.NET 框架 (https://github.com/accord-net/framework/) 在成像应用程序中的使用。目前我有一些基本要求 - 从 USB 摄像头捕获视频以显示在 UI 和 view/change 所有摄像头属性上。
Accord.Video.DirectShow.VideoCaptureDevice.DisplayPropertyPage 可以很好地显示相机属性,例如亮度、对比度、色调等,但不显示可用的相机分辨率。
Accord.Video.DirectShow.VideoCaptureDevice.VideoCapabilities 只返回一个分辨率,但我期待更多。
我已经尝试了 VideoCapx (http://videocapx.com/) ActiveX 控件并使用其 ShowVideoFormatDlg 方法我可以显示一个对话框,其中显示所有可用的分辨率、帧速率等。我知道这是制造商提供的对话框并访问通过 OLE\COM。我正在寻找一种通过 .NET 访问它的方法,希望通过 Accord 框架。
我知道额外的分辨率可能是转换过滤器的属性,但是我对 .NET 中的 DirectShow 和 COM 接口不熟悉,所以我正在寻找一些指导。
我用于包装 .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