Fedora34通过dnf安装OpenCV后运行cv.imshow报QSocketNotifier错误如何解决
报错原因
Fedora官方源中预编译的OpenCV包默认选择Qt作为GUI后端编译,直接调用cv.imshow()时,Qt后端初始化GUI上下文的逻辑和普通Python主线程的运行上下文不匹配:Qt的QSocketNotifier组件仅支持在通过QThread启动的线程中运行,Python主线程没有对应Qt线程上下文,因此触发该报错。此外如果缺少cv.waitKey()调用,OpenCV的GUI事件循环无法正常启动,也会叠加触发该类异常。
解决方案
- 方案1(最简便,无需重新编译):补全OpenCV GUI必要的事件循环调用,修改代码如下:
import cv2 as cv img = cv.imread('/home/a/dog.jpeg') # 先判断图片是否读取成功,避免空指针异常 if img is None: print("图片读取失败,请检查路径是否正确") else: cv.imshow('dog', img) cv.waitKey(0) # 等待用户按下任意按键后继续执行 cv.destroyAllWindows() # 手动销毁所有OpenCV创建的GUI窗口
注意:cv.waitKey()是OpenCV HighGUI模块处理按键、窗口重绘等事件的核心调度函数,所有cv.imshow()调用都必须搭配该函数使用,否则GUI窗口无法正常渲染。
方案2:更换OpenCV的GUI后端,重新编译OpenCV时添加CMake参数
-D WITH_QT=OFF -D WITH_GTK=ON,关闭Qt后端启用GTK后端,编译完成后替换当前安装的OpenCV库即可彻底规避该Qt相关报错。方案3:如果无需可视化展示图片,直接删除
cv.imshow()相关的GUI调用即可,不会影响OpenCV其他图像处理功能的正常运行。
内容的提问来源于stack exchange,提问作者Bralow Qin
相关产品推荐
相关产品推荐

