使用Picamera2.capture_array存图到RAM时的程序异常排查
问题排查与解决方案
1. 程序无响应、不终止的核心排查
程序无输出、无法自动结束,大概率是主线程被阻塞或异常被静默吞掉,按以下方向排查:
- Picamera2捕获阻塞:
capture_array()必须在相机启动后才能正常获取帧,检查是否遗漏start()调用,示例正确流程:picam2 = Picamera2() config = picam2.create_preview_configuration(main={"format": "RGB888", "size": (640, 480)}) picam2.configure(config) picam2.start() # 缺失此步骤会导致capture_array无限等待 frame = picam2.capture_array() - GPIO逻辑阻塞:如果舵机控制用了
time.sleep()且参数过大,或驱动库(RPi.GPIO/pigpio)初始化错误,会导致线程挂起。检查舵机代码是否有无限循环或未处理的阻塞逻辑。 - 异常静默处理:若代码存在
try-except但未打印异常,会吞掉所有错误导致无输出,修改为:try: # 捕获图片/角度识别逻辑 except Exception as e: print(f"Error: {e}")
2. 图片无显示的修复
预期显示图片但未出现,需检查:
- 显示逻辑缺失:用
cv2.imshow()时必须调用cv2.waitKey(1)刷新窗口,若设为0会无限等待按键:import cv2 cv2.imshow("Capture", frame) cv2.waitKey(1) # 至少等待1ms确保窗口渲染 - 远程运行环境限制:SSH远程运行未开启X11转发时,
imshow会失效,可先保存图片验证捕获是否成功:cv2.imwrite("test_capture.jpg", frame)
3. “no center of mass found”未打印的原因
- 函数未触发调用:检查捕获图片后是否正确执行
get_angle(frame),以及函数内部的蓝点识别逻辑是否满足打印条件(比如阈值设置过高导致未检测到蓝点,却没走到打印分支)。 - 输出被重定向:后台运行程序时输出可能被写入日志而非终端,直接在终端前台运行程序查看输出。
4. 初始GPIO占用警告的处理
GPIO通道占用警告说明有其他进程占用目标引脚,用以下命令排查占用进程:
sudo lsof /dev/gpiomem
或重启树莓派释放GPIO资源,确保仅当前程序占用舵机引脚。
内容的提问来源于stack exchange,提问作者Ricky W.
相关产品推荐
相关产品推荐

