HRESULT STDMETHODCALLTYPE CVCamPin::GetStreamCaps(int iIndex, AM_MEDIA_TYPE **pmt, BYTE *pSCC)
{
*pmt = CreateMediaType(&m_mt);
DECLARE_PTR(VIDEOINFOHEADER, pvi, (*pmt)->pbFormat);
//if (iIndex == 0) iIndex = 9;
int VCamX = 0;
int VCamY = 0;
switch (iIndex)
{
case 0:
{
VCamX = 320;
VCamY = 240;
break;
}
case 1:
{
VCamX = 640;
VCamY = 360;
break;
}
case 2:
{
VCamX = 640;
VCamY = 480;
break;
}
case 3:
{
VCamX = 800;
VCamY = 488;
break;
}
case 4:
{
VCamX = 800;
VCamY = 600;
break;
}
case 5:
{
VCamX = 960;
VCamY = 544;
break;
}
case 6:
{
VCamX = 1280;
VCamY = 720;
break;
}
case 7:
{
VCamX = 1280;
VCamY = 960;
break;
}
case 8:
{
VCamX = 1600;
VCamY = 900;
break;
}
case 9:
{
VCamX = 1920;
VCamY = 1080;
break;
}
}
pvi->bmiHeader.biCompression = BI_RGB;
pvi->bmiHeader.biBitCount = 24;
pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi->bmiHeader.biWidth = VCamX;
pvi->bmiHeader.biHeight = VCamY;
pvi->bmiHeader.biPlanes = 1;
pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader);
pvi->bmiHeader.biClrImportant = 0;
pvi->rcTarget.left = 0;
pvi->rcTarget.right = VCamX;
pvi->rcTarget.top = 0;
pvi->rcTarget.bottom = VCamY;
pvi->rcSource.left = 0;
pvi->rcSource.right = VCamX;
pvi->rcSource.top = 0;
pvi->rcSource.bottom = VCamY;
pvi->AvgTimePerFrame = (1000000000 / 100) / 30;
pvi->dwBitRate = VCamX*abs(VCamY) * 3 * 30;
(*pmt)->majortype = MEDIATYPE_Video;
(*pmt)->subtype = MEDIASUBTYPE_RGB24;
(*pmt)->formattype = FORMAT_VideoInfo;
(*pmt)->bTemporalCompression = FALSE;
(*pmt)->bFixedSizeSamples = TRUE;
(*pmt)->lSampleSize = pvi->bmiHeader.biSizeImage;
(*pmt)->cbFormat = sizeof(VIDEOINFOHEADER);
DECLARE_PTR(VIDEO_STREAM_CONFIG_CAPS, pvscc, pSCC);
pvscc->guid = MEDIATYPE_Video;
pvscc->VideoStandard = AnalogVideo_None;
pvscc->InputSize.cx = 0;
pvscc->InputSize.cy = 0;
pvscc->MinCroppingSize.cx = 0;
pvscc->MinCroppingSize.cy = 0;
pvscc->MaxCroppingSize.cx = VCamX;
pvscc->MaxCroppingSize.cy = VCamY;
pvscc->CropGranularityX = 0;
pvscc->CropGranularityY = 0;
pvscc->CropAlignX = 0;
pvscc->CropAlignY = 0;
pvscc->MinOutputSize.cx = 0;
pvscc->MinOutputSize.cy = 0;
pvscc->MaxOutputSize.cx = VCamX;
pvscc->MaxOutputSize.cy = VCamY;
pvscc->OutputGranularityX = VCamX;
pvscc->OutputGranularityY = VCamY;
pvscc->StretchTapsX = 0;
pvscc->StretchTapsY = 0;
pvscc->ShrinkTapsX = 0;
pvscc->ShrinkTapsY = 0;
pvscc->MinFrameInterval = 200000; //50 fps
pvscc->MaxFrameInterval = 50000000; // 0.2 fps
pvscc->MinBitsPerSecond = (320 * 240 * 3 * 8) / 5;
pvscc->MaxBitsPerSecond = VCamX * VCamY * 3 * 8 * 50;
return NOERROR;
}
这个函数 中给出10个可选的分辨率 摄像头可选的分辨率里面也显示
我也重载了 SetFormat设置分辨率 的 函数
HRESULT STDMETHODCALLTYPE CVCamPin::SetFormat(AM_MEDIA_TYPE *pmt)
{
DECLARE_PTR(VIDEOINFOHEADER, pvi, m_mt.pbFormat);
m_mt = *pmt;
IPin* pin;
CBasePin::ConnectedTo(&pin);
int nCount = 0;
CHAR str[256] = { 0 };
sprintf(str, "x==%d,y==%d", pvi->bmiHeader.biWidth, pvi->bmiHeader.biHeight);
MessageBox(NULL, str, NULL, MB_OK);
if (pin)
{
IFilterGraph *pGraph = m_pParent->GetGraph();
pGraph->Reconnect(this);
}
m_iImageWidth = pvi->bmiHeader.biWidth;
m_iImageHeight = pvi->bmiHeader.biHeight;
GetMediaType(1, &m_mt);
return S_OK;
}
但是我现在遇到一个问题,在更换分辨率的时候 SetFormat一直 收到 的 摄像头默认初始化的640*480 分辨率(GetMediaType 设置的一个分辨率)没有收到 那个选择分辨率,无论怎么切换 都不行,没法 获取想要的分辨率,但是我在opencv中 切换分辨率是 可以的 ,求大神指教一下是为什么?