单目相机清晰度怎么改

:pushpin: 核心结论

根据你的配置信息(Origincar USB 2.0 相机 + 1280x720 @ 20fps),2.5m 扫码距离已接近硬件极限。USB 2.0 相机 + 720p 分辨率在 1.3m 可用,但 2.5m 需要优化参数 + 可能更换硬件。


:wrench: 立即执行的优化方案

方案一:调整曝光参数(最关键)

从你的 v4l2-ctl 输出看,曝光值只有 34(范围 78-2500),这是图像偏暗的主要原因:

# 1. 切换到手动曝光模式
v4l2-ctl --device=/dev/video0 -c auto_exposure=1

# 2. 提高曝光时间(从 34 提高到 800-1200)
v4l2-ctl --device=/dev/video0 -c exposure_time_absolute=1000

# 3. 提高增益(从 0 提高到 20-30)
v4l2-ctl --device=/dev/video0 -c gain=25

# 4. 提高锐度(从 6 提高到 10-12)
v4l2-ctl --device=/dev/video0 -c sharpness=12

# 5. 关闭自动对焦,手动调整对焦环
v4l2-ctl --device=/dev/video0 -c focus_automatic_continuous=0
v4l2-ctl --device=/dev/video0 -c focus_absolute=4096  # 先保持默认,然后手动旋转镜头

测试效果后,将参数写入启动脚本:

# 在你的相机启动脚本中添加上述命令
# 位置:/app/camera_configs/origincar/start_camera.sh 或类似文件

方案二:检查更高分辨率支持

# 查看相机支持的所有分辨率
v4l2-ctl --device=/dev/video0 --list-formats-ext

# 如果支持 1920x1080,尝试切换
v4l2-ctl --device=/dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=MJPG

:warning: 注意:USB 2.0 带宽限制,1080p 可能只能达到 10-15fps,需要权衡。


方案三:手动对焦优化(关键)

自动对焦在扫码场景往往不准,需要手动调整:

  1. 关闭自动对焦(上面已执行)
  2. 在 2.5m 处放置二维码
  3. 手动旋转相机镜头,直到二维码最清晰
  4. 记录对焦值(通过 v4l2-ctl --all | grep focus 查看)
  5. 将固定对焦值写入启动脚本

:bullseye: 扫码距离提升的硬件限制

配置 1.3m 2.5m 建议
1280x720 + USB 2.0 :white_check_mark: 可用 :warning: 极限 优化曝光 + 手动对焦
1920x1080 + USB 2.0 :white_check_mark: 可用 ️ 勉强 帧率会降到 10-15fps
1920x1080 + USB 3.0 :white_check_mark: 可用 :white_check_mark: 推荐 建议更换 USB 3.0 相机

2.5m 扫码的硬性要求:

  • 二维码尺寸 ≥ 5cm × 5cm
  • 分辨率 ≥ 1920x1080
  • 镜头焦距 ≥ 4mm(广角镜头扫码距离短)

扫码算法优化建议

如果硬件无法更换,从算法侧优化:

# 在扫码代码中添加图像预处理
import cv2

def preprocess_for_qr(image):
    # 1. 提高对比度
    clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    enhanced = clahe.apply(gray)
    
    # 2. 锐化
    kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
    sharpened = cv2.filter2D(enhanced, -1, kernel)
    
    # 3. 降噪
    denoised = cv2.fastNlMeansDenoising(sharpened, None, 10, 7, 21)
    
    return denoised

:clipboard: 完整测试流程

# 1. 应用优化参数
v4l2-ctl --device=/dev/video0 -c auto_exposure=1
v4l2-ctl --device=/dev/video0 -c exposure_time_absolute=1000
v4l2-ctl --device=/dev/video0 -c gain=25
v4l2-ctl --device=/dev/video0 -c sharpness=12
v4l2-ctl --device=/dev/video0 -c focus_automatic_continuous=0

# 2. 查看当前参数
v4l2-ctl --device=/dev/video0 --all | grep -E "exposure|gain|sharpness|focus"

# 3. 测试扫码效果
# 在 2.5m 处放置标准二维码(建议 10cm×10cm)
# 运行你的扫码程序测试

# 4. 如果效果仍不佳,逐步提高曝光值(每次 +200)
v4l2-ctl --device=/dev/video0 -c exposure_time_absolute=1200
# 测试 -> 1400 -> 测试 -> 直到图像亮度合适但不过曝

:police_car_light: 最终建议

如果上述优化后 2.5m 扫码仍不稳定,建议:

  1. 更换 USB 3.0 工业相机(如海康 MV-CS050-10UC,500 万像素)
  2. 选择焦距更长的镜头(6mm 或 8mm,而非广角)
  3. 增加补光灯(提高环境照度)

社区有类似案例参考:


需要确认

  1. 你的二维码尺寸是多少?(2.5m 距离建议 ≥ 8cm)
  2. 环境光照条件如何?(室内/室外?有无补光?)
  3. 扫码帧率要求?(如果允许降低帧率,可尝试 1080p)

先执行上面的曝光参数调整,测试后反馈效果!