【问题标题】:QT Creator has Error Locating OpenCV Sub-Headers Within HeadersQT Creator 在标头中定位 OpenCV 子标头时出错
【发布时间】:2016-11-29 19:23:51
【问题描述】:

问题:

我正在尝试将我一直在开发的 OpenCV 项目集成到 Qt GUI 中。话虽如此,我认为最简单的方法是将 OpenCV 集成到 Qt Creator 中,而不是继续在 Visual Studio 2015 中工作。

但是,我遇到了一个问题。我的项目无法编译,因为它在我调用的任何头文件中都找不到子头文件的目录。

例如,如果包含 highgui.hpp 并尝试编译我的程序,它将抛出一个错误,指出 没有这样的文件或目录 opencv2/core/cvdef.hopencv2/core/base.hppopencv2/core/cvstd.hpp

附上图片以更清楚地说明我的意思:

初始过程:

我使用 CMake 通过 MinGW(64 位)生成必要的 makefile,然后使用 mingw32-make 编译它们。之后我运行 mingw32-make install 将上述文件安装到我的系统中。 (仅供参考,这包括将系统路径变量编辑到 MinGW 安装文件夹中 gccg++ 的位置)。

在 QT Creator 中,我在 QT_TEST.pro 文件中设置了以下路径:

INCLUDEPATH += C:/Users/micha/Documents/OpenCV/opencv/mingw-release/install/include/opencv2
LIBS += C:/Users/micha/Documents/OpenCV/opencv/mingw-release/install/x64/mingw/bin
LIBS += -lopencv_core310 -lopencv_highgui310 -lopencv_imgproc310

根据我看过的每个教程,这就是所有需要的设置。

我尝试过(但不成功)的事情:

  • 设置我的路径变量以包含头文件和子头文件的位置。
  • 在我的 QT_TEST.pro 文件中包含子标题的路径作为 LIBSINCLUDEPATH
  • 正在重新启动我的计算机。

从这里我不知道该去哪里。我真的很想为我的项目创建一个漂亮的 UI,而 Qt 似乎是正确的方法。您可以提供任何帮助来帮助解决我的问题,我们将不胜感激。

【问题讨论】:

  • LIBS += C:/Users/micha/Documents/OpenCV/opencv/mingw-release/install/x64/mingw/bin 是一个库目录?
  • 是的,它包括所有 3.1.0 库。
  • 那么前面的-L在哪里?
  • 我也认为包含路径应​​该是这样的:INCLUDEPATH += C:/Users/micha/Documents/OpenCV/opencv/mingw-release/install/include/
  • 包含文件夹包含什么?我的猜测是你的 make install 在某种程度上失败了,你留下的是骨架头文件,而不是与你的 cmake 配置相对应的生成的头文件。

标签: c++ qt opencv qt-creator


【解决方案1】:

问题是由不正确的INCLUDEPATH 和不正确使用main.cpp 中的OpenCV 标头引起的。

INCLUDEPATH应该指向OpenCV头文件的根目录,而不是直接指向opencv2。正如@Saeid Yazdani 所说,它应该是INCLUDEPATH += C:/Users/micha/Documents/OpenCV/opencv/mingw-release/install‌​/include

main.cpp 中,highgui.hppcore.hpp 标头使用不正确。它应该像这样包含:

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

查看 OpenCV 源代码库中的 Cpp Samples 以获取更多使用示例。

【讨论】:

  • 嗨@Michael Lilley,它可以解决您的问题还是需要进一步调查?
【解决方案2】:

通过执行以下操作,我设法让 open cv 正常工作。

我下载了 Visual Studio 2015。您需要确保在安装过程中检查 c++ 项。默认情况下它不会出现。您需要额外下载 5GB。

我下载了带有visual studio 2015 64位版本的QT 5.7 build并安装了它。

我下载了 Open CV 3.1.0 并提取了文件。

我将 bin 路径添加到我的环境变量中。即 E:\OpenCv\build\x64\vc14\bin

我在 QT 中创建了一个项目并将其添加到我的 .pro 文件中。

INCLUDEPATH += E:/OpenCv/build/include


debug {
    LIBS += "E:/OpenCv/build/x64/vc14/lib/opencv_world310d.lib"
}

release {
    LIBS += "E:/OpenCv/build/x64/vc14/lib/opencv_world310.lib"
}

我从示例中挑选了一些最少的代码,然后程序编译了。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "opencv2/opencv.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

/// Global variables
Mat src, erosion_dst, dilation_dst;

int erosion_elem = 0;
int erosion_size = 0;
int dilation_elem = 0;
int dilation_size = 0;
int const max_elem = 2;
int const max_kernel_size = 21;

/** Function Headers */
void Erosion( int, void* );
void Dilation( int, void* );
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    /// Load an image
     src = imread("C:\\Users\\IWC\\Desktop\\images.jpg");

     if( src.empty() )


     /// Create windows
     namedWindow( "Erosion Demo", WINDOW_AUTOSIZE );
     namedWindow( "Dilation Demo", WINDOW_AUTOSIZE );
     moveWindow( "Dilation Demo", src.cols, 0 );

     /// Create Erosion Trackbar
     createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo",
             &erosion_elem, max_elem,
             Erosion );

     createTrackbar( "Kernel size:\n 2n +1", "Erosion Demo",
             &erosion_size, max_kernel_size,
             Erosion );

     /// Create Dilation Trackbar
     createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo",
             &dilation_elem, max_elem,
             Dilation );

     createTrackbar( "Kernel size:\n 2n +1", "Dilation Demo",
             &dilation_size, max_kernel_size,
             Dilation );

     /// Default start
     Erosion( 0, 0 );
     Dilation( 0, 0 );

     waitKey(0);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/**
 * @function Erosion
 */
void Erosion( int, void* )
{
  int erosion_type = 0;
  if( erosion_elem == 0 ){ erosion_type = MORPH_RECT; }
  else if( erosion_elem == 1 ){ erosion_type = MORPH_CROSS; }
  else if( erosion_elem == 2) { erosion_type = MORPH_ELLIPSE; }

  Mat element = getStructuringElement( erosion_type,
                       Size( 2*erosion_size + 1, 2*erosion_size+1 ),
                       Point( erosion_size, erosion_size ) );
  /// Apply the erosion operation
  erode( src, erosion_dst, element );
  imshow( "Erosion Demo", erosion_dst );
}

/**
 * @function Dilation
 */
void Dilation( int, void* )
{
  int dilation_type = 0;
  if( dilation_elem == 0 ){ dilation_type = MORPH_RECT; }
  else if( dilation_elem == 1 ){ dilation_type = MORPH_CROSS; }
  else if( dilation_elem == 2) { dilation_type = MORPH_ELLIPSE; }

  Mat element = getStructuringElement( dilation_type,
                       Size( 2*dilation_size + 1, 2*dilation_size+1 ),
                       Point( dilation_size, dilation_size ) );
  /// Apply the dilation operation
  dilate( src, dilation_dst, element );
  imshow( "Dilation Demo", dilation_dst );
}

【讨论】:

    【解决方案3】:

    我的猜测是您没有成功 make install 您的 opencv 库,当从源代码编译它们时,需要复制与您的 CMake 配置相对应的所有标头。您的包含文件夹应包含您构建中包含的所有 opencv 模块的标题和子文件夹,而不仅仅是 opencv.hpp

    对此question 的公认答案解释了在使用 msvs 构建时它是如何完成的。在您的情况下,mingw32-make install 应该已经完成​​了(所以请检查您的包含文件夹)。

    此外,正如@Nikita 正确指出的那样,您不应包含 opencv2 文件夹,而应包含其根目录

    INCLUDEPATH += C:/Users/micha/Documents/OpenCV/opencv/mingw-release/install/include

    【讨论】:

    • 嗨@zeFrenchy,我在下面发布了我为解决我的问题所做的事情作为答案。虽然我不再有能力测试您的解决方案并且在使用mingw32-make install 时成功了,但我相信您走在正确的轨道上,因为我记得mingw32-make 如果我在一代中包含预编译标头,则会吐出错误我的makefile;所以也许这与此有关。由于我不希望这笔赏金白白浪费,因此我将把它提供给您,希望您的解决方案能够引导我走上正确的道路来解决我在 Windows 中的问题。
    • 干杯,迈克尔。我曾经在使用 Visual Studio 从他们的 git repo 编译 opencv 时遇到过类似的问题。链接的答案当时为我解决了这个问题。太糟糕了,您无法生成 make 错误消息以查看我的预感是否正确。
    【解决方案4】:

    感谢您所有有用的回复,并尝试了您建议的所有内容,并使用各种不同的设置从源代码重新编译了 OpenCV,但不幸的是,在使用 Windows 时,我无法让库在 Qt Creator 中正确链接。我认为这是我使用的机器特有的问题。

    话虽如此,我用 Manjaro Linux 覆盖了 Windows(我知道,这是一个激烈的举动),现在链接库没有问题。在我的 .pro 文件中,我包含了以下几行:

    INCLUDEPATH += /usr/local/include/opencv2
    LIBS += `pkg-config opencv --libs`
    

    现在一切都很好。再次感谢大家的帮助。如果可以的话,我会将赏金平均分配给此线程中的每个人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 2016-11-08
      相关资源
      最近更新 更多