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

时间:2016-11-06 17:36:48

标签: c++ qt opencv qt-creator

问题:

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

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

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

附上图片以更清楚地展示我在说什么:

初始流程:

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

在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似乎是正确的方法。我们非常感谢您提供的帮助解决我的问题的任何帮助。

4 个答案:

答案 0 :(得分:4)

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

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

highgui.hpp core.hpp#include "opencv2/core.hpp" #include "opencv2/highgui.hpp" 标头中使用不正确。它应该包括在内:

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

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

答案 1 :(得分:1)

我已经设法通过执行以下操作来打开cv工作。

我下载了visual studio 2015.您需要确保在安装过程中检查c ++项目。它不是默认的。它是一个额外的5GB,你需要下载。

我使用visual studio 2015 64位版本下载了QT 5.7版本并安装了它。

我下载了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 );
}

答案 2 :(得分:1)

我的猜测是你没有成功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

答案 3 :(得分:0)

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

话虽这么说,我用Manjaro Linux覆盖了Windows(我知道,这是一种激烈的举动),现在连接库没有问题。在我的.pro文件中,我包含了这些行:

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

现在一切都很好。再次,谢谢大家的帮助。如果可以的话,我会将赏金均匀地分配给这个帖子中的每个人。