DirectShow技术,某些摄像头不能调节分辨率

xiaoqiangsun xiaoqiangsun 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
根据网上的一些资料,用IAMStreamConfig接口已经实现了获取摄像头支持的分辨率;然后用setformat也成功设置了一些摄像头的分辨率,但是,,我目前程序用在平板设备上,结果,Surface上可以的,Tablet2一直不行,永远是445*225的,但是得到支持的分辨率从1280*720一直到445不等有很多。。

很急哎,软件想在445的分辨率太dt了,有没有人碰到过有些摄像头也不能设置分辨率的;指教指教。

我的代码是这样的:

有一些变量先声明一下
IGraphBuilder *m_pGB;//filter最大容器
IAMStreamConfig *m_pSC; //设备
ICaptureGraphBuilder2* m_pCapture;
IBaseFilter* m_pBF;
IMediaControl* m_pMC;//采集媒体使用接口
IVideoWindow* m_pVW;//采集视屏使用接口
CComPtr <ISampleGrabber> m_pGrabber;


HRESULT hr;
hr = InitCaptureGraphBuilder(iDeviceID);
if (FAILED(hr))
{
AfxMessageBox("Failed to get video interfaces!");
return hr;
}
// create a sample grabber
hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
if( !m_pGrabber )
{
AfxMessageBox("Fail to create SampleGrabber, maybe qedit.dll is not registered?");
return hr;
}
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );

//上面是初始化一些东西,没什么问题


//设置视频格式
//分辨率

AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
hr = m_pGrabber->SetMediaType(&mt);
hr = m_pGB->AddFilter( pGrabBase, L"Grabber" );

m_pSC->GetNumberOfCapabilities(&count, &size);
CString strMsg;
AM_MEDIA_TYPE* mtPtr;
VIDEOINFOHEADER *vihPtr = NULL;
for (int i = 0; i < pixelTypeSize; i ++)
{
m_pSC->GetStreamCaps(j, &mtPtr, reinterpret_cast<BYTE*>(&pSCC));
long cbPixel = 2;

VIDEOINFOHEADER *pVih = reinterpret_cast<VIDEOINFOHEADER*>(mtPtr->pbFormat);
pVih->bmiHeader.biWidth = width;
pVih->bmiHeader.biHeight = height;
//我这边省略了一些东西,排序了一下,反正得到的width和height是支持里面得到的

mtPtr->lSampleSize = pVih->bmiHeader.biSizeImage = ((width+3)&~3)*height*cbPixel;

hr = m_pSC->SetFormat(mtPtr);
if(FAILED(hr))
continue;


hr = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
if( FAILED( hr ))
hr = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
//hr = m_pGrabber->SetMediaType(mtPtr);
if( SUCCEEDED(hr))
{
break;
}
}

if(FAILED(hr))
return hr;
hr = m_pGrabber->GetConnectedMediaType(&mt);
if (FAILED(hr))
return hr;
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
mCB.lWidth = vih->bmiHeader.biWidth;
mCB.lHeight = vih->bmiHeader.biHeight;
////***关键就是这里通过GetConnectedMediaType得到的Width和height永远是445....
所以后面就是445了,之前设置的都没有起效果。。。


大致就是这样。。。
...全文

相关推荐

VC 打开摄像头 (使用DirectShow)

**设置捕获格式**:使用IAMStreamConfig接口可以设置摄像头的输出格式,例如分辨率、帧率等。5.

Alex_Zhang_CV

DirectShow实战:摄像头实时预览、抓图与参数控制详解

视频采集与图像处理是桌面应用开发中的常见需求,尤其在涉及摄像头交互的场景中,实时预览、单帧抓取与画质调节构成了功能闭环。在Windows平台下,DirectShow作为经典多媒体框架,通过Filter Graph机制将采集设备、数据处理与渲染展示串联为可控制的流水线,为开发者提供了统一且稳定的实现路径。其技术价值在于:借助Sample Grabber精准拦截视频帧,利用IAMVideoProcAmp通用接口调节亮度、对比度等参数,能够有效解决多摄像头兼容与动态调整难题。从工业视觉检测到医疗影像采集,从安防监

小丸子书单

C#上位机用Aforge调用USB摄像头:枚举、预览、抓帧与参数调节全指南

Windows桌面应用中,摄像头接入是常见的功能需求。DirectShow作为Windows底层视频采集标准接口,长期支撑着各类图像设备的调用,而Aforge.NET则将其封装为C#友好接口,大幅降低了上位机开发的门槛。在实际工程中,USB摄像头会涉及设备枚举、视频流获取、抓帧保存、分辨率切换以及曝光参数调节等一系列基础操作。掌握这些能力后,无论是工位拍照存档、扫码镜头集成,还是工业视觉检测原型,都能快速落地。本文围绕C#上位机场景,完整梳理基于Aforge的摄像头调用流程,并结合实际经验标注常见坑点,为初

FFFire小火

DirectShow实战:Windows摄像头预览、抓图与视频参数调节

在Windows桌面开发中,视频采集是一项基础而关键的技术。从USB摄像头获取实时画面,涉及设备枚举、视频流传输、帧数据处理等多个环节。DirectShow作为老牌多媒体框架,凭借广泛的驱动兼容性和稳定的参数控制接口,至今仍是许多工业检测、教学演示和工具软件的首选。通过Filter Graph将采集设备、Sample Grabber与渲染器串联,可实现一边预览一边抓图;利用IAMVideoProcAmp和IAMCameraControl接口,能精确调节亮度、对比度、曝光等视频参数。掌握这些原理不仅能快速解决

我是跟野兽差不了多少

C#调用USB摄像头全攻略:从AForge到DirectShow的实践与避坑指南

在工业自动化和上位机软件开发中,视频采集与图像处理是高频需求,而USB摄像头作为最常见的图像输入设备,其调用方式与参数控制往往是开发者遇到的第一道门槛。从底层原理看,USB摄像头基于UVC协议,通过DirectShow或系统后端暴露能力,涉及设备枚举、分辨率、像素格式(如YUY2、MJPG)以及带宽计算等核心概念。理解这些基础,才能解决设备占用、花屏、帧率不足等典型问题。在工程实践中,开发者可根据场景选择不同技术路线:AForge.NET适合快速预览,OpenCvSharp便于与图像算法无缝衔接,而Dire

哗啦啦的小流弊
评论 7
收藏 已收藏
分享
返回顶部
xiaoqiangsun
图形处理/算法 19,463 成员 50,678 内容