在opencv2.4.5(Qt gui特性)中使用createButton segfault

Posted

技术标签:

【中文标题】在opencv2.4.5(Qt gui特性)中使用createButton segfault【英文标题】:Using createButton in opencv2.4.5 (Qt gui features) segfault 【发布时间】:2013-05-04 23:47:45 【问题描述】:

我实际上在使用以下 OpenCV 示例时遇到了问题:

http://docs.opencv.org/2.4.5/modules/highgui/doc/qt_new_functions.html

(我更新了我的环境的路径并添加了示例中没有的回调函数)。

我编译Opencv设置Qt On:

图形用户界面: -- QT 4.x:是(版本 4.8.2 = 开源) -- QT OpenGL 支持:否 -- OpenGL 支持:否

当我尝试在 Qt 文档中找到的代码时:我有以下回溯:

(gdb) 回溯 #0 0x00007ffff14f53e8 in QAction::setEnabled(bool) () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4 #1 0x00007ffff67bf0db in GuiReceiver::enablePropertiesButtonEachWindow() () 来自 /usr/local/lib/libopencv_highgui.so.2.4 #2 0x00007ffff67c02db in GuiReceiver::addButton(QString, int, int, void*, void*) () from /usr/local/lib/libopencv_highgui.so.2.4 #3 0x00007ffff67c5e9a in GuiReceiver::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) () from /usr/local/lib/libopencv_highgui.so.2.4 #4 0x00007ffff0fcef77 在 QMetaMethod::invoke(QObject*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) const () 来自 /usr/lib/x86_64-linux-gnu/libQtCore.so.4 #5 0x00007ffff0fd134c 在 QMetaObject::invokeMethod(QObject*, char const*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) () 来自 /usr/lib/x86_64-linux-gnu/libQtCore.so.4 #6 0x00007ffff67b23a7 in cvCreateButton() from /usr/local/lib/libopencv_highgui.so.2.4 #7 0x0000000000400f6c in main (argc=, argv=) at main.cpp:20

有人有同样的问题吗? 我只是想明确一点,我不想在 Qt 中嵌入 Opencv,而只是使用 opencv 提供的 Qt 功能。

我在这里找到了答案的开始: How to use cv::createButton prototype in OpenCV

但这无关紧要……

感谢您的帮助。

还有一段代码有问题:

#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

void callbackButton(int state, void* userdata)

int main(int ac, char **av)

     namedWindow("main1",CV_WINDOW_NORMAL);
     namedWindow("main2",CV_WINDOW_AUTOSIZE | CV_GUI_NORMAL);
     int a = 0;

     createButton("test",callbackButton, &a, CV_CHECKBOX,1);
     return 0;

【问题讨论】:

【参考方案1】:

无法确认也无法否认这个问题是真实存在的,因为我的机器上有不同的设置(OpenCV 2.4.9 和 Qt 5.0.2)。

但我发现使用CV_GUI_NORMAL 创建一个窗口会使应用程序崩溃。文档指出:

CV_GUI_NORMALCV_GUI_EXPANDED:CV_GUI_NORMAL 是绘制没有状态栏和工具栏的窗口的旧方法,而 CV_GUI_EXPANDED 是新的增强 GUI。

我建议你暂时用CV_GUI_EXPANDED创建你的窗口。

【讨论】:

我已经试过 CV_GUI_EXPANDED 没有效果...谢谢你的建议。【参考方案2】:

我也无法使用 OpenCV 2.4.5 / Qt 4.8.0 创建按钮。我下载了 OpenCV 2.4.9 并在相同的设置下安装它,现在它可以工作了。

【讨论】:

以上是关于在opencv2.4.5(Qt gui特性)中使用createButton segfault的主要内容,如果未能解决你的问题,请参考以下文章

opencv2.4.5中cvStereoGCState在哪个模块

将 QtCreator 2.7.0 与 OpenCV 2.4.5 一起使用

Python Qt GUI设计:多线程中信号与槽的使用(基础篇—9)

Qt Gui 第一章~第二章

Qt多线程和GUI界面假死

Qt:访问在构造函数之外使用 GUI 小部件的类的函数