MatplotLib (TKinter) + OpenCV 在 Python 3 中崩溃

Posted

技术标签:

【中文标题】MatplotLib (TKinter) + OpenCV 在 Python 3 中崩溃【英文标题】:MatplotLib (TKinter) + OpenCV crashing in Python 3 【发布时间】:2017-08-21 07:43:00 【问题描述】:

我正在尝试运行一些 Python 3 代码,该代码首先显示一个 OpenCV 窗口,当它关闭时,它应该使用 MatplotLib 绘制一些东西。然而,在调用plt.show() 时程序崩溃:python3.6 意外退出。

import numpy as np

import matplotlib
matplotlib.use("TkAgg")     # <== Doesn't solve the problem
import matplotlib.pyplot as plt

import cv2
#cv2.ocl.setUseOpenCL(False)  <== Doesn't solve the problem

im = np.zeros((100,100,3))
cv2.imshow('test', im)
cv2.waitKey(0)

plt.plot(np.sin(np.linspace(0,20,200)))
plt.show()                  # <== Crashes on this call

在其他 *** 帖子中,我发现将 MatplotLib 后端设置为 TkAgg 应该可以解决此问题或设置 setUseOpenCL(false)。然而,这两个潜在的修复都不适用于我的 MacBook。我尝试了几件事,比如更改导入顺序,尝试交换 MatplotLib 后端。任何人都知道如何解决这个问题?

MacOS Sierra 10.12.3Python 3.6.0TKinter 8.5 版OpenCV 3.2.0 版MatplotLib 2.0.0 版

它如何崩溃的堆栈跟踪:

libc++abi.dylib:以 NSException 类型的未捕获异常终止

2017-03-28 11:30:45.639 python3.6[5208:78361] -[NSApplication _setup:]:无法识别的选择器发送到实例 0x7f997ec98190 2017-03-28 11:30:45.641 python3.6[5208:78361] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSApplication _setup:]:无法识别的选择器发送到实例 0x7f997ec98190” * 首先抛出调用栈: ( 0 核心基础 0x00007fffbeb80e7b 异常预处理 + 171 1 libobjc.A.dylib 0x00007fffd3760cad objc_exception_throw + 48 2核心基础0x00007fffbec02cb4-[NSObject(NSObject)不识别选择器:]+132 3 核心基础 0x00007fffbeaf2fb5 ___forwarding_ + 1061 4 核心基础 0x00007fffbeaf2b08 _CF_forwarding_prep_0 + 120 5 Tk 0x00000001032c45e6 TkpInit + 471 6 Tk 0x000000010323fc8d Tk_Init + 1794 7 _tkinter.cpython-36m-darwin.so 0x000000010311cde6 Tcl_AppInit + 82 8 _tkinter.cpython-36m-darwin.so 0x00000001031183a3 _tkinter_create + 1094 9 Python 0x0000000100b28ea2 _PyCFunction_FastCallDict + 172 10 Python 0x0000000100b927a2 call_function + 584 11 Python 0x0000000100b8fbbb _PyEval_EvalFrameDefault + 23930 12 Python 0x0000000100b92fbf _PyEval_EvalCodeWithName + 1973 13 Python 0x0000000100b938c4 _PyFunction_FastCallDict + 477 14 Python 0x0000000100aeea73 _PyObject_FastCallDict + 231 15 Python 0x0000000100aeeb93 _PyObject_Call_Prepend + 149 16 Python 0x0000000100aee8cb PyObject_Call + 102 17 Python 0x0000000100b3cd24 slot_tp_init + 61 18 Python 0x0000000100b39ac3 type_call + 184 19 Python 0x0000000100aeea34 _PyObject_FastCallDict + 168 20 Python 0x0000000100b9263b call_function + 225 21 Python 0x0000000100b8fbbb_PyEval_EvalFrameDefault + 23930 22 Python 0x0000000100b93976 _PyFunction_FastCall + 122 23 Python 0x0000000100b92775 call_function + 539 24 Python 0x0000000100b8fbbb _PyEval_EvalFrameDefault + 23930 25 Python 0x0000000100b92fbf _PyEval_EvalCodeWithName + 1973 26 Python 0x0000000100b89e02 PyEval_EvalCodeEx + 100 27 Python 0x0000000100b101e3 函数调用 + 363 28 Python 0x0000000100aee8cb PyObject_Call + 102 29 Python 0x0000000100b8fe16 _PyEval_EvalFrameDefault + 24533 30 Python 0x0000000100b92fbf _PyEval_EvalCodeWithName + 1973 31 Python 0x0000000100b936da 快速函数 + 241 32 Python 0x0000000100b92775 call_function + 539 33 Python 0x0000000100b8fbbb _PyEval_EvalFrameDefault + 23930 34 Python 0x0000000100b93976 _PyFunction_FastCall + 122 35 Python 0x0000000100b92775 call_function + 539 36 Python 0x0000000100b8fbbb_PyEval_EvalFrameDefault + 23930 37 Python 0x0000000100b92fbf _PyEval_EvalCodeWithName + 1973 38 Python 0x0000000100b936da 快速函数 + 241 39 Python 0x0000000100b92775 call_function + 539 40 Python 0x0000000100b8fbbb _PyEval_EvalFrameDefault + 23930 41 Python 0x0000000100b92fbf _PyEval_EvalCodeWithName + 1973 42 Python 0x0000000100b936da 快速函数 + 241 43 Python 0x0000000100b92775 调用函数 + 539 44 Python 0x0000000100b8fbbb_PyEval_EvalFrameDefault + 23930 45 Python 0x0000000100b92fbf _PyEval_EvalCodeWithName + 1973 46 Python 0x0000000100b89d98 PyEval_EvalCode + 100 47 Python 0x0000000100bb33aa run_mod + 58 48 Python 0x0000000100bb36bf PyRun_FileExFlags + 178 49 Python 0x0000000100bb2d58 PyRun_SimpleFileExFlags + 676 50 Python 0x0000000100bc74d0 Py_Main + 3472 51 python3.6 0x0000000100adfe17 python3.6 + 7703 52 libdyld.dylib 0x00007fffd4044255 开始 + 1 53 ??? 0x0000000000000002 0x0 + 2 )

【问题讨论】:

似乎是 Mac 的问题。我无法在它按预期工作的 Windows 上重现它。 不是 Mac 问题。该代码在没有“TkAgg”的情况下在我的 Mac 上运行良好,并且使用 matplotlib.use("TkAgg") 生成相同的错误。 你有没有找到解决这个问题的方法?我在使用 OpenCV 3.2.0 的 Mac 上遇到了同样的问题。 遇到同样的问题,你找到解决办法了吗 【参考方案1】:

不确定它是否会帮助你们,但我在尝试将 matplotlib 嵌入 kivy 应用程序(也在 mac 上)时遇到了类似的问题,经过几个小时的谷歌搜索、重写类、卸载和重新安装,以及在某一时刻甚至试图完全使用不同的库进行绘图。我发现最简单的解决方案是完全关闭 ('TkAgg') 后端,因为它看起来不太好,然后明确声明 OSX 一个

import matplotlib
matplotlib.use("MacOSX")
import matplotlib.pyplot as plt

为我工作,奥卡姆剃刀和我想的一切,祝你好运!

【讨论】:

【参考方案2】:

不知道 matplotlib,但我可以想象窗口管理可能存在问题。试试这个:

cv2.imshow('test', im)
cv2.waitKey(1)
cv2.destroyWindow('test')

至少这是在不再使用时处理已打开的 cv2.imshow() 窗口的正确方法。

【讨论】:

不确定verified.human,但我有同样的问题,这并不能解决我的问题。

以上是关于MatplotLib (TKinter) + OpenCV 在 Python 3 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

tkinter的GUI设计:界面与逻辑分离-- 与 matplotlib 结合

用Tkinter打造GUI开发工具(49)在Tkinter窗口上动态显示matplotlib.pyplot图形

用Tkinter打造GUI开发工具(49)在Tkinter窗口上动态显示matplotlib.pyplot图形

tkinter内嵌Matplotlib系列之解读官网教材

matplotlib - Blender python中没有名为tkinter的模块

MatplotLib (TKinter) + OpenCV 在 Python 3 中崩溃