升级至OpenCV4后使用VideoCapture读取外接摄像头出现aliasing异常问题
根因定位
- OpenCV 4.x对Linux平台UVC摄像头的默认采集后端做了调整,3.4.1版本默认优先使用V4L2后端,4.5.3版本未显式指定后端时会优先调用GStreamer,该后端对Leopard Imaging这类工业级UVC摄像头的兼容性不足,像素格式从采样格式转BGR时会出现走样失真
- 读取本地MP4文件走FFmpeg解码链路,和摄像头采集逻辑完全独立,因此输出正常
修复方案
方案1:修改采集代码,显式指定后端与采集参数
修改后的测试代码如下:
import cv2 # 显式指定V4L2后端打开摄像头 cap = cv2.VideoCapture(0, cv2.CAP_V4L2) # 固定摄像头输出分辨率,和3.4.1版本下的采集分辨率保持一致 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) # 强制设置像素格式为MJPG(也可替换为YUYV测试适配效果) cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG')) # 丢弃摄像头初始化阶段的前5帧不稳定数据 for _ in range(5): ret, frame = cap.read() if ret: cv2.imwrite("output.jpg", frame) cap.release()
方案2:调整OpenCV编译参数(源码安装场景适用)
编译OpenCV 4.5.3时添加以下编译选项,优化V4L2后端优先级:
- 开启
WITH_V4L2=ON、WITH_LIBV4L=ON - 无GStreamer使用需求时可开启
WITH_GSTREAMER=OFF,完全规避后端兼容问题
方案3:版本升级
直接升级OpenCV至4.5.4及以上版本,该版本已修复UVC摄像头采集的像素格式转换兼容bug
内容的提问来源于stack exchange,提问作者Baffer
相关产品推荐
相关产品推荐

