QT Creator在头文件中无法找到OpenCV的子头文件

3

问题:

我正试图将我正在开发的OpenCV项目集成到Qt GUI中。因此,我想到最简单的方法是将OpenCV集成到Qt Creator中,而不是继续在Visual Studio 2015中工作。

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

例如,如果我包含highgui.hpp并尝试编译我的程序,它将抛出一个错误,指出opencv2/core/cvdef.hopencv2/core/base.hppopencv2/core/cvstd.hpp等文件不存在。

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

初始过程:

我使用CMake生成必要的makefile,并使用MinGW(64位)进行编译,然后使用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文件中将子头文件的路径包含在LIBS和INCLUDEPATH中。 - 重新启动电脑。
从这里开始,我不知道该怎么办了。我真的想为我的项目创建一个漂亮的UI界面,而Qt似乎是正确的选择。如果您能提供任何帮助来解决我的问题,我将不胜感激。

1
我认为包含路径应该是这样的:INCLUDEPATH += C:/Users/micha/Documents/OpenCV/opencv/mingw-release/install/include/ - Dumbo
如果您指定的路径中包含所需的文件,那么我不知道问题出在哪里。另一个建议是,将路径放在双引号中!然后尝试使用反斜杠分隔符,例如 LIBS += -L"C:\blah\blah" - Dumbo
最后一次努力,将大写字母I放入包含路径中,例如-I"c:...."。 - Dumbo
如果我这样做,那么我的高级头文件也无法被识别,例如 core.hpphighgui.hpp 等等。 - Michael Lilley
1
你的"include"文件夹包含了什么?我猜测你的make install在某种程度上失败了,因此你只剩下骨架头文件,而不是与你的cmake配置对应的已生成头文件。 - zeFrenchy
显示剩余5条评论
4个回答

5

该问题是由于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示例,了解更多用法示例。


嗨,@Michael Lilley,这是否解决了你的问题,还是需要进一步调查? - Nikita

1
我猜测您在从源代码编译opencv库时没有成功执行make install,这是必须的操作,以便复制与您的CMake配置对应的所有头文件。您的include文件夹应该包含您构建中包含的所有opencv模块的头文件和子文件夹,而不仅仅是opencv.hpp此问题的被接受答案解释了如何在使用msvs构建时完成此操作。在您的情况下,mingw32-make install应该已经完成了此操作(请检查您的include文件夹)。
此外,正如@Nikita正确指出的那样,您不应该包含opencv2文件夹,而是应该包含其根目录。

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


嗨@zeFrenchy,我在下面的答案中发布了我解决问题的方法。虽然我不再具备测试您的解决方案的能力,并且在使用mingw32-make install时成功,但我确信您正在正确的轨道上,因为我记得如果在生成我的makefile时包含预编译头文件,mingw32-make会输出错误;所以也许这与此有关。由于我不想浪费这个赏金,我将把它给你,希望你的解决方案能引导我走上解决Windows问题的正确道路。 - Michael Lilley
谢谢,Michael。我曾经在使用Visual Studio编译OpenCV的Git仓库时遇到过类似的问题。当时,链接的答案解决了我的问题。很遗憾你无法生成make错误消息以查看我的直觉是否正确。 - zeFrenchy

1
我已经成功让OpenCV运行,方法如下:
我下载了Visual Studio 2015,并确保在安装过程中勾选了C++选项。这不是默认的,需要额外下载5GB。
我下载了QT 5.7版本,使用Visual Studio 2015 64位版本进行构建并安装。
我下载了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 );
}

0
我感谢您提供的所有有益回复,并尝试了您建议的一切,以及使用各种不同设置从源代码重新编译了OpenCV,但遗憾的是,当在Windows中使用Qt Creator时,我无法正确链接库。我认为这是特定于我正在使用的计算机的问题。
话虽如此,我用Manjaro Linux覆盖了Windows(我知道,这有点激进),现在链接库没有任何问题。在我的.pro文件中,我包含了以下行:
INCLUDEPATH += /usr/local/include/opencv2
LIBS += `pkg-config opencv --libs`

现在一切都很顺利。再次感谢大家的帮助。如果可以的话,我愿意将奖金平均分配给这个帖子中的每个人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接