QT Creator在标头中定位OpenCV子标头时出错

QT Creator has Error Locating OpenCV Sub-Headers Within Headers

本文关键字:出错 OpenCV Creator QT 定位      更新时间:2023-10-16

问题:

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

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

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

附件中的图片更清楚地展示了我的意思:

  • https://i.stack.imgur.com/MwKg8.jpg
  • https://i.stack.imgur.com/U1fal.jpg

初始过程:

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

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

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似乎是正确的选择。如果你能帮我解决问题,我们将不胜感激。

问题是由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示例。

我通过以下操作成功地打开了简历。

我下载了visualstudio2015。您需要确保在安装过程中检查了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 );
}

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

这个问题的公认答案解释了在使用msv构建时是如何做到的。在您的情况下,mingw32-make install应该已经完成了(所以请检查您的包含文件夹(。

此外,正如@Nikita正确指出的那样,您不应该包括opencv2文件夹,而应该包括它的根

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

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

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

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

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