You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在树莓派5上用PyQt5显示树莓派摄像头3出现异常图像

解决树莓派摄像头3结合PyQt5显示时过曝/传感器异常的问题

问题原因分析

  • 摄像头捕获的图像格式与QImage指定的解析格式不匹配:原代码使用Format_RGB16解析,但picamera2.capture_array()默认返回3通道8位的RGB数据,格式不匹配直接导致画面色彩、亮度异常。
  • 未明确配置摄像头的输出格式,可能导致数据编码混乱。
  • 缺少自动曝光、白平衡等必要的传感器控制配置,易引发过曝问题。

解决方案步骤

  1. 明确指定摄像头捕获的图像格式为RGB888,保证数据格式统一。
  2. 使用匹配的QImage格式,并正确设置字节步长,确保图像数据被正确解析。
  3. 配置摄像头的自动控制参数,解决过曝问题。
  4. 移除不必要的固定传感器模式设置,让picamera2自动适配最优模式。

修改后的完整代码

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QPixmap, QImage
import picamera2
from picamera2 import controls

class CameraWidget(QWidget):
    def __init__(self, parent=None):
        super(CameraWidget, self).__init__(parent)

        self.camera = picamera2.Picamera2()
        # 配置预览模式,明确指定RGB888格式与目标分辨率
        config = self.camera.create_preview_configuration(
            main={"size": (640, 480), "format": "RGB888"}
        )
        self.camera.configure(config)
        
        # 开启自动曝光、自动白平衡,手动补充基础参数避免过曝
        self.camera.set_controls({
            "AeEnable": True,
            "AwbEnable": True,
            "ExposureTime": 10000,  # 可根据场景调整,单位微秒
            "AnalogueGain": 1.0
        })
        
        self.camera.start()

        self.label = QLabel()
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        self.setLayout(layout)

        self.timer = QTimer()
        self.timer.timeout.connect(self.update_frame)
        self.timer.start(int(1000 / 24))  # 24帧刷新率

    def update_frame(self):
        # 捕获RGB888格式的图像数组,形状为(480, 640, 3)
        image = self.camera.capture_array()
        # 计算字节步长:宽度 × 每个像素的字节数(RGB各占1字节)
        bytes_per_line = 640 * 3
        # 创建匹配格式的QImage
        qt_image = QImage(image.data, 640, 480, bytes_per_line, QImage.Format_RGB888)
        pixmap = QPixmap.fromImage(qt_image)
        self.label.setPixmap(pixmap)

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("Raspberry Pi Camera Viewer")
        self.setGeometry(100, 100, 640, 480)

        self.central_widget = CameraWidget()
        self.setCentralWidget(self.central_widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

额外排查建议

  • 检查摄像头硬件连接是否牢固,确保树莓派已通过raspi-config开启摄像头接口。
  • 更新依赖库版本:pip install --upgrade picamera2 pyqt5,避免版本兼容性问题。
  • 若仍存在过曝,可微调ExposureTime参数(减小数值降低曝光)或AnalogueGain(减小数值降低增益)。

内容的提问来源于stack exchange,提问作者Alex StAubin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 09:53:11