Ubuntu 14.04下OpenCV 3.4.0调用cv.imshow()报错求助
解决OpenCV
cv.imshow() 触发Qt相关错误的问题 这个问题我之前在Ubuntu 14.04上用OpenCV 3.x的时候也碰到过,主要是OpenCV的Qt GUI后端在初始化或者运行环境上出了问题,给你几个靠谱的解决办法:
先排查运行环境
- 如果你是通过SSH远程连接Ubuntu且没有启用X11转发,那
cv.imshow()根本无法工作——因为远程终端没有图形输出环境。这种情况直接放弃显示,改用保存图片的方式:
之后你可以把保存的文件下载到本地查看。cv.imwrite('messi_output.jpg', img)
桌面环境下的快速修复
如果是在Ubuntu桌面本地运行,先检查代码是否缺少关键的事件循环处理:
OpenCV的imshow()依赖Qt的事件循环才能正常渲染窗口,必须在调用imshow()后加上waitKey()和destroyAllWindows(),完整代码应该是:
import numpy as np import cv2 as cv img = cv.imread('messi5.jpg',0) print(img) cv.imshow('image', img) cv.waitKey(0) # 无限等待按键输入,处理Qt事件循环 cv.destroyAllWindows() # 关闭所有OpenCV窗口
很多时候报错就是因为漏掉了cv.waitKey(),它不仅是等待按键,还负责驱动Qt的界面事件,没有它的话窗口无法正常初始化,就会触发你看到的线程错误。
换用Matplotlib显示图片
如果加了waitKey()还是报错,大概率是pip安装的OpenCV版本的Qt绑定有问题(Ubuntu 14.04的系统Qt版本比较老,和OpenCV 3.4.0的兼容性不太好)。这时候可以用Matplotlib来替代OpenCV的GUI显示功能,代码如下:
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('messi5.jpg',0) print(img) # OpenCV读入的灰度图是单通道,需要指定灰度色映射 plt.imshow(img, cmap='gray', interpolation='bicubic') plt.xticks([]), plt.yticks([]) # 隐藏坐标轴,让显示更干净 plt.show()
Matplotlib的显示逻辑更独立,不会依赖OpenCV的Qt后端,基本能解决这类GUI报错。
终极方案:重新编译OpenCV(可选)
如果以上方法都不行,你可以尝试重新编译OpenCV,指定用GTK而不是Qt作为GUI后端(GTK在Ubuntu 14.04上兼容性更好):
- 先卸载pip安装的OpenCV:
pip uninstall python-opencv - 安装编译依赖:
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev - 下载OpenCV 3.4.0的源码,解压后进入源码目录,执行:
编译安装完成后,Python就能使用带GTK后端的OpenCV了,mkdir build && cd build cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_GTK=ON .. make -j4 sudo make installimshow()应该就能正常工作。
内容的提问来源于stack exchange,提问作者Peter111
相关产品推荐
相关产品推荐

