在树莓派5上用PyQt5显示树莓派摄像头3出现异常图像
解决树莓派摄像头3结合PyQt5显示时过曝/传感器异常的问题
问题原因分析
- 摄像头捕获的图像格式与QImage指定的解析格式不匹配:原代码使用
Format_RGB16解析,但picamera2.capture_array()默认返回3通道8位的RGB数据,格式不匹配直接导致画面色彩、亮度异常。 - 未明确配置摄像头的输出格式,可能导致数据编码混乱。
- 缺少自动曝光、白平衡等必要的传感器控制配置,易引发过曝问题。
解决方案步骤
- 明确指定摄像头捕获的图像格式为RGB888,保证数据格式统一。
- 使用匹配的QImage格式,并正确设置字节步长,确保图像数据被正确解析。
- 配置摄像头的自动控制参数,解决过曝问题。
- 移除不必要的固定传感器模式设置,让
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
相关产品推荐
相关产品推荐

