调用cv2.imshow后matplotlib的plt.show()触发段错误无法显示图表怎么办
冲突原因
OpenCV的imshow依赖自身的GUI后端(通常为Qt/GTK),和matplotlib的默认GUI后端存在资源竞争。cv2.destroyAllWindows调用后不会立即清空所有GUI消息队列和底层资源,后续调用plt.show时会触发内存访问错误,也就是你遇到的段错误。
可行解决方法
- 方法1:提前指定matplotlib的GUI后端,避开冲突
在导入matplotlib.pyplot之前,手动指定不和OpenCV冲突的后端,比如TkAgg,修改导入部分代码即可,其余逻辑不需要改动:
import numpy as np import cv2 import matplotlib # 后端指定必须写在import pyplot之前 matplotlib.use('TkAgg') import matplotlib.pyplot as plt
- 方法2:销毁OpenCV窗口后补充消息队列处理
在cv2.destroyAllWindows()之后新增一行cv2.waitKey(1),主动触发一次OpenCV的消息循环,清空残留的窗口资源:
cap.release() cv2.destroyAllWindows() # 新增下面这行即可 cv2.waitKey(1) plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show()
- 方法3:隔离GUI进程
如果以上两种方法都无效,将matplotlib绘图逻辑放在独立的子进程中运行,进程资源隔离可彻底避开后端冲突:
from multiprocessing import Process # 把绘图逻辑封装成函数 def plot_func(): plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show() # OpenCV处理逻辑不变,处理完成后启动子进程绘图 cap.release() cv2.destroyAllWindows() p = Process(target=plot_func) p.start() p.join()
内容的提问来源于stack exchange,提问作者Bogdan Fateev
相关产品推荐
相关产品推荐

