当OpenCV和tensorflow都使用libgtk时,会发生分段错误。我在下面给出了一个简单的脚本来创建问题,相关的硬件和软件版本以及堆栈跟踪。 FWITW,相同版本的opencv,tensorflow,pandas等在3月份安装在另一台机器上时工作得很好。不确定究竟发生了什么变化。
如何创建问题
以下脚本运行正常。按预期捕获并显示框架
import cv2
cv2.namedWindow('frame')
但是,如果我在上面的任何地方添加一行“import pandas”或“import tensorflow”,我会遇到分段错误。例如..
import tensorflow
import cv2
cv2.namedWindow('frame')
相关的硬件和软件信息:
硬件x86架构(Intel I5核心) GPU GTX 1060 OS Linux Mint 18.2
Ubuntu内核版本4.8.0-53-通用#56~16.04.1-Ubuntu OpenCV 3.4版 Tensorflow版本1.4.1 熊猫版本0.20.1
CUDA 9.1 Nvidia司机396.26
我尝试过的一些事情 1.使用GTK2.4和GTK3编译OpenCV。结果相同 2.更改NVIDIA驱动程序版本
我打算接下来尝试使用CUDA 9.0,但老实说,我不知道这与任何事情有什么关系。
细分错误回溯 (gdb)bt
#0 0x000000000052b88c in ?? ()
#1 0x00000000005653ab in PyErr_WarnEx ()
#2 0x00007fff840f7938 in ?? () from /usr/lib/python2.7/dist-packages/gobject/_gobject.x86_64-linux-gnu.so
#3 0x00007fffd539e9a4 in g_logv () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#4 0x00007fffd539ebcf in g_log () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#5 0x00007fffd5690d7d in ?? () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#6 0x00007fffd569107b in g_type_register_static () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#7 0x00007fffd5691695 in g_type_register_static_simple () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#8 0x00007fffd5e173a4 in gdk_display_manager_get_type () from /usr/lib/x86_64-linux-gnu/libgdk-3.so.0
#9 0x00007fffd5e17409 in gdk_display_manager_get () from /usr/lib/x86_64-linux-gnu/libgdk-3.so.0
#10 0x00007fffd62fcc8b in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#11 0x00007fffd62d420b in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#12 0x00007fffd53a2f67 in g_option_context_parse () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#13 0x00007fffd62d3fe8 in gtk_parse_args () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#14 0x00007fffd62d4049 in gtk_init_check () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#15 0x00007fffd62d4099 in gtk_init () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#16 0x00007fffeef176c3 in cvInitSystem () from /usr/local/lib/libopencv_highgui.so.3.4
#17 0x00007fffeef1a764 in cvNamedWindow () from /usr/local/lib/libopencv_highgui.so.3.4
#18 0x00007fffeef1aead in cvShowImage () from /usr/local/lib/libopencv_highgui.so.3.4
#19 0x00007fffeef11349 in cv::imshow(cv::String const&, cv::_InputArray const&) () from /usr/local/lib/libopencv_highgui.so.3.4
#20 0x00007ffff67078d3 in pyopencv_cv_imshow(_object*, _object*, _object*) () from /usr/local/lib/python2.7/dist-packages/cv2.so
#21 0x00000000004bc3fa in PyEval_EvalFrameEx ()
#22 0x00000000004c136f in PyEval_EvalFrameEx ()
#23 0x00000000004c136f in PyEval_EvalFrameEx ()
#24 0x00000000004b9ab6 in PyEval_EvalCodeEx ()
#25 0x00000000004eb30f in ?? ()
#26 0x00000000004e5422 in PyRun_FileExFlags ()
#27 0x00000000004e3cd6 in PyRun_SimpleFileExFlags ()
#28 0x0000000000493ae2 in Py_Main ()
#29 0x00007ffff7810830 in __libc_start_main (main=0x4934c0 <main>, argc=2, argv=0x7fffffffe058, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,
stack_end=0x7fffffffe048) at ../csu/libc-start.c:291
#30 0x00000000004933e9 in _start ()
答案 0 :(得分:0)
这里的基本问题是同一个进程使用两个不同版本的gtk。
我的OpenCV使用了GTK3。 Python使用GTK2(在import gtk中)。 Tensorflow和pandas都在他们的处理中的某个地方导入gtk,因此他们确实有同样的问题。
目前,我已经通过使用gtk2重新编译opencv来解决这个问题。其他替代方案将是..
将python升级到gtk3。我环顾四周可用的资源,并不相信它们足够坚固。
使用GTK3编译tensorflow和pandas(目前我刚刚为两者导入了预编译库)。显然,这不是一个强大的解决方案,因为其他一些软件包可能会使用内置的gtk再次导致同样的问题。