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

问题描述 投票:2回答:2

我试图运行一些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

在其他StackOverflow帖子中,我发现将MatplotLib后端设置为TkAgg应修复此问题或设置setUseOpenCL(false)。但是,这些潜在的修复程序都无法在我的MacBook上运行。我尝试了几件事,比如更改导入顺序,尝试交换MatplotLib后端。任何人都知道如何解决这个问题?

MacOS Sierra 10.12.3 Python 3.6.0 TKinter版本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 CoreFoundation 0x00007fffbeb80e7b exceptionPreprocess + 171 1 libobjc.A.dylib 0x00007fffd3760cad objc_exception_throw + 48 2的CoreFoundation 0x00007fffbec02cb4 - [NSObject的(NSObject的)doesNotRecognizeSelector:] + 132 3的CoreFoundation 0x00007fffbeaf2fb5 ___forwarding_ + 1061 4的CoreFoundation 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 0x000000 0100b927a2 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 function_call + 363 28 Python 0x0000000100aee8cb P. yObject_Call + 102 29的Python 0x0000000100b8fe16 _PyEval_EvalFrameDefault + 24533 30的Python 0x0000000100b92fbf _PyEval_EvalCodeWithName + 1973 31的Python 0x0000000100b936da fast_function + 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 fast_function + 241 39的Python 0x0000000100b92775 call_function + 539 40的Python 0x0000000100b8fbbb _PyEval_EvalFrameDefault + 23930 41的Python 0x0000000100b92fbf _PyEval_EvalCodeWithName + 1973 42的Python 0x0000000100b936da fast_function + 241 43的Python 0x0000000100b92775 call_function + 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 start + 1 53 ??? 0x0000000000000002 0x0 + 2)

python python-3.x opencv matplotlib tkinter
2个回答
2
投票

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

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.