QT Creator 在 Headers 中定位 OpenCV Sub-Headers 时出错

QT Creator has Error Locating OpenCV Sub-Headers Within Headers

问题:

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

但是,我运行遇到了问题。我的项目无法编译,因为它无法在我调用的任何 header 文件中找到 sub-header 文件的目录。

例如,如果包含 highgui.hpp 并尝试编译我的程序,它将抛出一个错误,指出 没有这样的文件或opencv2/core/cvdef.hopencv2/core/base.hpp[= 的目录 79=].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

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

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

从这里我不知道去哪里。我真的很想为我的项目创建一个漂亮的 UI,而 Qt 似乎是正确的选择。如果您能提供帮助解决我的问题,我们将不胜感激。

问题是由于INCLUDEPATH和OpenCV header在main.cpp中使用不正确造成的。

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

main.cpp 中,highgui.hppcore.hpp header 都使用不正确。它应该包括在内:

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

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

我已通过执行以下操作设法使 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 );
}

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

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

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

现在一切正常。再次感谢大家的帮助。如果可以的话,我会把赏金平均分配给这个帖子中的每个人。

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

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

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

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