如何通过MediaFoundation设置/获取UVC摄像头的亮度、对比度等属性
在MediaFoundation中控制UVC摄像头的图像属性(亮度、对比度等)
如果你用MediaFoundation做UVC摄像头预览,不需要依赖DirectShow的IAMVideoProcAmp,MF本身提供了原生的控制方式,也支持兼容调用DirectShow接口,以下是具体实现:
原生MediaFoundation实现(推荐)
步骤1:获取摄像头的IMFMediaSource
这是MF摄像头预览的基础,先通过设备枚举拿到目标摄像头的IMFMediaSource实例。
步骤2:获取IMFVideoProcAmp接口
MF的IMFVideoProcAmp接口专门用于控制视频采集设备的图像属性,直接从IMFMediaSource查询即可:
IMFVideoProcAmp* pProcAmp = nullptr; HRESULT hr = pMediaSource->QueryInterface(IID_PPV_ARGS(&pProcAmp)); if (FAILED(hr)) { // 处理接口获取失败的情况 }
步骤3:操作亮度、对比度等属性
通过GetRange获取属性的可调范围,Get读取当前值,Set设置新值:
- 亮度对应枚举值:
MF_VIDEOPROCAMP_BRIGHTNESS - 对比度对应枚举值:
MF_VIDEOPROCAMP_CONTRAST - 其他常用属性:饱和度(
MF_VIDEOPROCAMP_SATURATION)、色调(MF_VIDEOPROCAMP_HUE)等
示例代码:
// 获取亮度的可调范围 LONG minBright, maxBright, stepBright, defaultBright; BOOL autoBright; hr = pProcAmp->GetRange(MF_VIDEOPROCAMP_BRIGHTNESS, &minBright, &maxBright, &stepBright, &defaultBright, &autoBright); // 获取当前亮度值 LONG currentBright; hr = pProcAmp->Get(MF_VIDEOPROCAMP_BRIGHTNESS, ¤tBright, &autoBright); // 设置亮度为自定义值(关闭自动调节) LONG targetBright = (minBright + maxBright) / 2; // 取中间值 hr = pProcAmp->Set(MF_VIDEOPROCAMP_BRIGHTNESS, targetBright, FALSE);
兼容DirectShow的IAMVideoProcAmp接口
如果必须使用DirectShow的IAMVideoProcAmp,可以通过MF的IMFGetService接口获取:
// 从IMFMediaSource获取IMFGetService IMFGetService* pGetService = nullptr; hr = pMediaSource->QueryInterface(IID_PPV_ARGS(&pGetService)); if (SUCCEEDED(hr)) { // 请求DirectShow的IAMVideoProcAmp服务 IAMVideoProcAmp* pDsProcAmp = nullptr; hr = pGetService->GetService(MF_SERVICE_DXVA_DIRECTSHOW_SERVICE, IID_PPV_ARGS(&pDsProcAmp)); if (SUCCEEDED(hr)) { // 使用DirectShow接口操作属性 long val, min, max, step, def; BOOL autoVal; pDsProcAmp->Get(VidProcAmp_Brightness, &val, &min, &max, &step, &def, &autoVal); pDsProcAmp->Set(VidProcAmp_Brightness, 100, FALSE); pDsProcAmp->Release(); } pGetService->Release(); }
关键注意事项
- 不同UVC摄像头支持的属性范围不同,调用
GetRange前要检查返回值,若返回E_NOTIMPL则说明该属性不支持调节。 - 设置属性时必须确保值在
GetRange返回的min和max之间,否则会返回错误。 - 只有关闭自动调节(
Set方法最后一个参数传FALSE),手动设置的属性值才会生效。
内容的提问来源于stack exchange,提问作者World
相关产品推荐
相关产品推荐

