You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:45:04