链接 QtCreator && OpenCv

Posted

技术标签:

【中文标题】链接 QtCreator && OpenCv【英文标题】:Linking QtCreator && OpenCv 【发布时间】:2011-12-19 01:19:50 【问题描述】:

我在从 opencv(2.3.1) 链接库时遇到问题,找不到解决方法。 我将 qtCreator 与 mingw 和预构建的 vc10 动态库文件一起使用。 所以,这是我到目前为止所做的:

.pro 文件:

TEMPLATE = app
INCLUDEPATH += "E:/opencv/build/include/"
INCLUDEPATH += "E:/opencv/build/include/opencv/"
INCLUDEPATH += "E:/opencv/build/include/opencv2/"

INCLUDEPATH += $$PWD/../opencv/build/x86/vc10
DEPENDPATH += $$PWD/../opencv/build/x86/vc10

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../opencv/build/x86/vc10/lib/ -lopencv_core231
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../opencv/build/x86/vc10/lib/ -lopencv_core231d
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../opencv/build/x86/vc10/lib/ -lopencv_highgui231
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../opencv/build/x86/vc10/lib/ -lopencv_highgui231d
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../opencv/build/x86/vc10/lib/ -lopencv_imgproc231
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../opencv/build/x86/vc10/lib/ -lopencv_imgproc231d
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../opencv/build/x86/vc10/lib/ -lopencv_calib3d231
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../opencv/build/x86/vc10/lib/ -lopencv_calib3d231d
...

我测试了一个使用 opencv 中的 highgui 库的应用程序,它编译并运行良好,但是当我尝试使用 cvPyrDown(来自 imgproc_c.h)时,它编译但无法正确加载库,它“意外退出”代码-1073741515。 我不明白为什么会这样。从 .pro 文件中可以看出,我像 highgui 一样链接了 imgproc 库,但它仍然无法正常工作! 有什么建议吗?

编辑

好的,问题是 Visual Studio 创建的库具有与 g++ 不同的命名约定,这就是它无法工作的原因。如果这是真的,我仍然无法解释为什么它可以与 highgui 库一起使用。任何想法?

【问题讨论】:

【参考方案1】:

你不应该使用 Qt 的 MSVC 版本吗?

【讨论】:

Mingw 应该能够处理它..(它适用于 highgui 库..)【参考方案2】:

这是哪个版本的 Opencv?我建议尝试最新的 2.3,并使用 CMake 而不是 .pro 文件,这是整个项目的构建系统。

然后你只需在 CMakeLists.txt 上 file->open-project,你就可以看看如何使用 CMake 设置示例。

如果这个最新的,那么 1) highgui 使用 QT,因此它可能与 qt creator 一起玩得更好,并且 2) 在 windows 上使用 .pro 构建可能未经测试;不可避免地需要 CMake 也就不足为奇了。

编辑:查看库的 CMakeLists.txt 文件 ....

# CMakeLists.txt for /modules/highgui
 #YV
if (HAVE_QT)
if (HAVE_QT_OPENGL)
    set(QT_USE_QTOPENGL TRUE)
endif()
INCLUDE($QT_USE_FILE)

SET(_RCCS_FILES src/window_QT.qrc)
QT4_ADD_RESOURCES(_RCC_OUTFILES $_RCCS_FILES)

SET(_MOC_HEADERS src/window_QT.h )
QT4_WRAP_CPP(_MOC_OUTFILES $_MOC_HEADERS)

set(HIGHGUI_LIBRARIES $HIGHGUI_LIBRARIES $QT_LIBRARIES $QT_QTTEST_LIBRARY)
set(highgui_srcs $highgui_srcs src/window_QT.cpp $_MOC_OUTFILES $_RCC_OUTFILES )
endif()

if(WIN32)
   if(NOT HAVE_QT)
      set(highgui_srcs $highgui_srcs src/window_w32.cpp)
   endif()
  set(highgui_srcs $highgui_srcs src/cap_vfw.cpp src/cap_cmu.cpp   src/cap_dshow.cpp)
   if(HAVE_MIL)

    set(highgui_srcs $highgui_srcs src/cap_mil.cpp)
endif()
endif()

if(UNIX)
if(NOT HAVE_QT)        
    if(HAVE_GTK)
        set(highgui_srcs $highgui_srcs src/window_gtk.cpp)
    endif()
endif()
 ....
endif()

但是“imgproc”的 CMakeLists.txt 并没有做任何具体的检查……只是把责任转嫁给 main opencv lib:

 define_opencv_module(imgproc opencv_core)

【讨论】:

我使用的是最新版本的opencv(2.3.1)。如果库是用 msvc 构建的(使用 g++ 之外的另一种命名约定),highgui 使用 qt 真的很重要吗? 可能。你真的应该用mingw重建opencv......也使用cmake,而不是qmake......这就是OpenCV测试/开发的东西,如果你坚持使用qmake,你就会为自己设置不必要的障碍。

以上是关于链接 QtCreator && OpenCv的主要内容,如果未能解决你的问题,请参考以下文章

基础I/O

Qt & QWT:QwtPlotCurve - 曲线未显示

汇编语言交叉编译&Makefile文件

大数据处理技术作业——使用HBase&MongoDB&MapReduce进行数据存储和管理

大数据处理技术作业——使用HBase&MongoDB&MapReduce进行数据存储和管理

HDU 2141(二分&三分 _B题)解题报告