树莓派OpenCV Trackbar报GLib-GObject-CRITICAL警告原因及解决
问题描述
我正在Raspberry-Pi(树莓派)上使用PiCamera开发HSV颜色校准菜单,校准功能基于OpenCV提供的trackbar、masking特性实现。
使用的源码
源码如下:
import numpy as np from picamera.array import PiRGBArray from picamera import PiCamera import time import cv2 camera = PiCamera() camera.resolution = (640, 480) camera.framerate = 32 raw_capture = PiRGBArray(camera, size=(640, 480)) time.sleep(0.1) def nothing(x): pass cv2.namedWindow("Trackbars") cv2.createTrackbar("L - H", "Trackbars", 0, 179, nothing) cv2.createTrackbar("L - S", "Trackbars", 0, 255, nothing) cv2.createTrackbar("L - V", "Trackbars", 0, 255, nothing) cv2.createTrackbar("U - H", "Trackbars", 179, 179, nothing) cv2.createTrackbar("U - S", "Trackbars", 255, 255, nothing) cv2.createTrackbar("U - V", "Trackbars", 255, 255, nothing) for frame in camera.capture_continuous(raw_capture, format="bgr", use_video_port=True): image = frame.array hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) l_h = cv2.getTrackbarPos("L - H", "Trackbars") l_s = cv2.getTrackbarPos("L - S", "Trackbars") l_v = cv2.getTrackbarPos("L - V", "Trackbars") u_h = cv2.getTrackbarPos("U - H", "Trackbars") u_s = cv2.getTrackbarPos("U - S", "Trackbars") u_v = cv2.getTrackbarPos("U - V", "Trackbars") lower_blue = np.array([l_h, l_s, l_v]) upper_blue = np.array([u_h, u_s, u_v]) mask = cv2.inRange(hsv, lower_blue, upper_blue) result = cv2.bitwise_and(image, image, mask=mask) number_of_white_pix = np.sum(mask == 255) cv2.putText(result,str(number_of_white_pix),(0,50),cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0),2,cv2.LINE_AA) cv2.imshow("Frame", image) cv2.imshow("mask", mask) cv2.imshow("result", result) key = cv2.waitKey(1) & 0xFF raw_capture.truncate(0) if key == ord("q"): break cv2.destroyAllWindows()
报错/警告信息
程序运行后始终弹出如下警告:
(Trackbars:8238): GLib-GObject-CRITICAL **: 10:02:29.171: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
咨询问题
- 触发该警告的根本原因是什么?
- 该警告应如何处理修复?
备注: 已检索相关问题,返回结果多为NVIDIA GPU相关故障,无对应Raspberry-Pi场景的解决方案。
回答
1. 警告触发的根本原因
这个警告和NVIDIA驱动没有任何关联,是树莓派官方软件源预装OpenCV的图形后端兼容bug:
树莓派OS默认通过apt安装的python3-opencv包,绑定了老旧的GTK2作为HighGUI(也就是imshow、createTrackbar这些GUI功能的后端)。GTK2版本的trackbar控件在滑块数值更新、控件重绘时,会错误尝试释放一个从未被正确初始化的GObject内存指针,GLib在执行对象释放操作前检测到指针不是合法的GObject实例,就会抛出这个断言失败的CRITICAL级日志。
这个警告属于非致命提示,不会中断程序运行,也不会影响取色、mask计算、画面显示的实际功能,唯一的影响是会在终端反复打印提示行。
2. 修复方案
根据自己的需求选任意一种方案即可:
- 方案一:直接忽略
如果不介意终端打印提示,不需要改任何代码,程序可以正常完成HSV校准的全部功能,不会出现功能异常。 - 方案二:屏蔽警告输出
不想换OpenCV版本的话,要么在代码最开头、导入cv2之前加一行配置屏蔽GLib日志:
要么运行脚本时直接重定向错误输出丢弃:import os os.environ['G_MESSAGES_DEBUG'] = 'none'python3 hsv_calib.py 2>/dev/null - 方案三:替换OpenCV版本彻底解决
卸载apt源安装的老旧OpenCV,换成pip源提供的新版OpenCV即可彻底消除bug,新版OpenCV绑定的GTK3/Qt后端不存在这个控件内存管理的问题,执行以下命令操作:
安装完成后重新运行脚本,trackbar重绘时就不会再弹出该GLib警告。sudo apt remove -y python3-opencv pip3 install opencv-python
内容的提问来源于stack exchange,提问作者renaldyks
相关产品推荐
相关产品推荐

