【问题标题】:Problem in Setting up QT and OpenGL to Integrate with OpenCV and C++ in Ubuntu 18.04 using CMake使用 CMake 在 Ubuntu 18.04 中设置 QT 和 OpenGL 以与 OpenCV 和 C++ 集成时出现问题
【发布时间】:2020-06-20 14:40:54
【问题描述】:

我一直在关注书中的 OpenCV 教程。在此之前,我的机器上已经安装了 OpenCV。我正在终端上使用 OpenCV 和 C++,并使用 CMake 编译我的程序。这是我的 Ubuntu OpenCV 版本:

Ubuntu 18.04.4 LTS
OpenCV version : 4.2.0

书中的结果与我的不同,显然他们使用的是 QT。在接下来的几章中,他们仍然使用 Qt。所以,我继续使用以下代码安装 Qt:

sudo apt-get install qtcreator
sudo apt-get install qt5-default

我还关注了Qt Wiki 的安装文档。当我检查我的 Qt 版本时,这就是我得到的:

$ qmake --version                                                                  
QMake version 3.1
Using Qt version 5.9.5 in /usr/lib/x86_64-linux-gnu

所以,现在我已经在我的机器上安装了 Qt,但是如何将它与我的 OpenCV 集成,以便我可以在我的程序中使用它而不是放置 highgui lib ?我遇到了这个错误:

The library is compiled without QT support in function

一直在网上找了一圈,还是不知道如何正确整合。

我尝试了什么

显然,除了完全卸载 OpenCV,然后在打开 QT 的情况下编译并重新安装它之外,别无他法。这就是我所做的:

  1. 完全卸载 OpenCV,然后通过从 Github 克隆 OpenCV 和 OpenCV contrib 重新安装它(已经安装了 3 次),在终端中使用 CMake 构建 OpenCV 期间,我添加了 WITH_QT = ON。这是我使用的完整设置:

    cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_C_EXAMPLES=ON \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_GENERATE_PKGCONFIG=ON \ 
    -D WITH_TBB=ON \ 
    -D WITH_V4L=ON \ 
    -D WITH_QT=ON \ 
    -D WITH_OPENGL=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \
    -D BUILD_EXAMPLES=ON ..
    

没问题,我正确安装了 OpenCV(用几个程序测试过)。这是版本:

$ pkg-config --modversion opencv 
4.2.0

我也遇到了这个问题:OpenCV integration With Qt,但仍然没有解决方案。但是,为什么即使在我使用 WITH_QT=ON 完全重新安装、构建和制作 OpenCV 之后,任何带有 QT 的项目(我有 QT_RADIOBOXcreateButton 上的其他项目)仍然会出错? CMake是否找不到QT?

    terminate called after throwing an instance of 'cv::Exception'
    what():  OpenCV(4.2.0-dev) /home/raisa/opencv_build/opencv/modules/highgui/src/window.cpp:597: 
    error: (-213:The function/feature is not implemented) 
    The library is compiled without QT support in function 'createButton'

    [2]    10467 abort (core dumped)  ./exerc13

这里是createButton

//Create buttons
createButton("Blur",  blurCallback,  NULL, QT_CHECKBOX, 0);
createButton("Grey",  greyCallback,  NULL, QT_RADIOBOX, 0);
createButton("RGB",   bgrCallback,   NULL, QT_RADIOBOX, 1);
createButton("Sobel", sobelCallback, NULL, QT_PUSH_BUTTON, 0);

有什么建议吗?

更新

我阅读了有关 Qt 集成的显式路径定义,而不是仅仅放置“WITH_QT=ON”。所以我决定使用 cmake-gui 并为 Qt 路径配置定义了每个路径。像这样:

WITH_QT=ON (checked in cmake-gui)
Qt5Concurrent_DIR = /home/raisa/Qt5.9.9/5.9.9/gcc_64/lib/cmake/Qt5Concurrent
Qt5Core_DIR       = /home/raisa/Qt5.9.9/5.9.9/gcc_64/lib/cmake/Qt5Core
Qt5Gui_DIR        = /home/raisa/Qt5.9.9/5.9.9/gcc_64/lib/cmake/Qt5Gui
Qt5OpenGL_DIR     = /home/raisa/Qt5.9.9/5.9.9/gcc_64/lib/cmake/Qt5OpenGL
Qt5Test_DIR       = /home/raisa/Qt5.9.9/5.9.9/gcc_64/lib/cmake/Qt5Test
Qt5Widgets_DIR    = /home/raisa/Qt5.9.9/5.9.9/gcc_64/lib/cmake/Qt5Widgets
Qt5_DIR           = /home/raisa/Qt5.9.9/5.9.9/gcc_64/lib/cmake/Qt5

(Qt 安装遵循Qt Wiki 的安装文档)

再次,OpenCV 安装完美。通过运行简单的程序进行测试。但是对于 Qt 仍然遇到相同的错误。我也不能让 OpenGL 与 OpenCV 一起工作。建议?

【问题讨论】:

  • 要在qt上使用opencv,你只需要在.pro文件中添加库和标志
  • @YunusTemurlenk 我没有在 QT(QT 编辑器)上使用 OpenCV。我将 C++ (.cpp) 与 OpenCV 库一起使用,我在终端中编写代码并希望将 QT 集成到其中。

标签: c++ qt opencv cmake terminal


【解决方案1】:

花了我将近 2 周的时间尝试集成 QT 和 OpenGL。我来回更改了我的 CMake 设置,所以我不确定这是否对每个人都一样,但这对我有用。确保您已在您的环境中正确安装和配置了 Java

我已经安装了 Java(通过运行 javajavac 检查),但不知何故 CMake 在配置中找不到它,所以我想我确实卸载了 Java 并重新安装了它。我想从干净的环境开始。所以我事先清除了所有内容(JavaQTOpenCVOpenGL)并使用 QT 和 OpenGL 再次配置 CMake,它运行良好。

  1. 彻底卸载 OpenCV。如果您使用 CMake 配置 OpenCV 或只是使用 purge 来配置 OpenCV,请使用 uninstall

    sudo apt-get purge '*opencv*'
    sudo find / -name "*opencv*" -exec rm -rf {} \;
    
  2. 从官方OpenCV website下载最新的OpenCV(现在是4.2.0版本)。

  3. 清除所有 QT 和 OpenGL 并重新安装它们。这是一个非常好的List of all Qt5 developement packages, available on Ubuntu,所以你知道你需要安装什么。

  4. 如果您安装了 Java,请先彻底卸载所有内容。 Here's a very nice post of how to do it,我把它放在这里。 (这部分会有很多清除和删除,请确保您阅读并理解您要删除的内容):

    删除所有与 Java 相关的包(Sun、Oracle、OpenJDK、IcedTea 插件、GIJ):

    dpkg-query -W -f='${binary:Package}\n' | grep -E -e '^(ia32-)?(sun|oracle)-java' -e '^openjdk-' -e '^icedtea' -e '^(default|gcj)-j(re|dk)' -e '^gcj-(.*)-j(re|dk)' -e '^java-common' | xargs sudo apt-get -y remove
    sudo apt-get -y autoremove
    

    清除配置文件(小心。此命令删除了 libsgutils2-2 和 virtualbox 配置文件):

    dpkg -l | grep ^rc | awk '{print($2)}' | xargs sudo apt-get -y purge
    

    删除 Java 配置和缓存目录:

    sudo bash -c 'ls -d /home/*/.java' | xargs sudo rm -rf
    

    删除手动安装的 JVM:

    sudo rm -rf /usr/lib/jvm/*
    

    从替代项中删除 Java 条目(如果仍有的话):

    for g in ControlPanel java java_vm javaws jcontrol jexec keytool mozilla-javaplugin.so orbd pack200 policytool rmid rmiregistry servertool tnameserv unpack200 appletviewer apt extcheck HtmlConverter idlj jar jarsigner javac javadoc javah javap jconsole jdb jhat jinfo jmap jps jrunscript jsadebugd jstack jstat jstatd native2ascii rmic schemagen serialver wsgen wsimport xjc xulrunner-1.9-javaplugin.so; do sudo update-alternatives --remove-all $g; done
    

    搜索可能剩余的 Java 目录:

    sudo updatedb
    sudo locate -b '\pack200'
    

    如果上面的命令产生像 /path/to/jre1.6.0_34/bin/pack200 这样的任何输出,请删除 bin 的父目录,如下所示:sudo rm -rf /path/to/jre1.6.0_34

  5. 重新安装 Java,我正在使用来自 Oracle 的一个(现在是版本 14)。下载文件并使用sudo dpkg -i 安装。

  6. 从 Ubuntu 软件中心安装 Apache Ant

  7. 在 etc/profile.d 中创建文件。

    sudo nano /etc/profile.d/(yourjdkversion).sh
    

    并把这行(在把它放在这里之前检查你的jdk版本是否正确)

    export JAVA_HOME="/usr/lib/jvm/jdk-14"
    export PATH="$PATH:${JAVA_HOME}/bin"
    

    (我在此步骤后重新启动)。

    运行java -versionant-version,如果返回正确的值,那么它们的配置正确,你就可以准备好了。我的:

    java -version                                                                    
    java version "14" 2020-03-17
    Java(TM) SE Runtime Environment (build 14+36-1461)
    Java HotSpot(TM) 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
    
    ant -version                                                                      
    Apache Ant(TM) version 1.10.7 compiled on September 1 2019
    
  8. 安装cmake-gui。打开它,放入OpenCV源码和构建目录。

  9. 配置

  10. 搜索选项WITH_QTWITH_OPENGLBUILD_JAVA,然后勾选所有选项。 无需更改任何路径,如果它在那里,CMake 会找到它。重新配置。

    这是我配置后的最新设置以供参考,请注意CMAKE 正确找到了QTOpenGL(在GUI 中)和JAVA(最后一行)。 Full configuration for reference is here (gist)。 Java 曾经位于 unavailable 部分,但 CMake 现在可以正确找到它。如果您的配置缺少其中之一,请尝试安装缺少的内容。我的:

      OpenCV modules:
        To be built:                 calib3d core dnn features2d flann gapi highgui imgcodecs imgproc java ml objdetect photo python2 python3 stitching ts video videoio
        Disabled:                    world
        Disabled by dependency:      -
        Unavailable:                 js ( --> Java used to be here, "unavailable" even though it's installed.)
        Applications:                tests perf_tests examples apps
        Documentation:               NO
        Non-free algorithms:         YES
    
      GUI: 
        QT:                          YES (ver 5.9.5)
          QT OpenGL support:         YES (Qt5::OpenGL 5.9.5)
        GTK+:                        NO
        OpenGL support:              YES (/usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so)
        VTK support:                 YES (ver 6.3.0)
    
    
      Java:                          
        ant:                         /snap/bin/ant (ver 1.10.7)
        JNI:                         /usr/lib/jvm/jdk-14/include /usr/lib/jvm/jdk-14/include/linux /usr/lib/jvm/jdk-14/include
        Java wrappers:               YES
        Java tests:                  YES
    
      Install to:                    /usr/local
    
  11. 如果您进行任何更改,请务必重新配置。

  12. 生成。

  13. 导航到您的构建目录并照常安装 OpenCV。

    make -j8 (check how many threads you can support, I use -j8)
    make install
    

完成。 用 QT 和 OpenGL 运行一两个 OpenCV 程序,看看它是否有效。

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 2014-01-07
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多