QT Creator在标头中定位OpenCV子标头时出错
QT Creator has Error Locating OpenCV Sub-Headers Within Headers
问题:
我正在尝试将我一直在做的OpenCV项目集成到Qt GUI中。话虽如此,我认为最简单的方法是将OpenCV集成到Qt Creator中,而不是继续在Visual Studio 2015中工作。
然而,我遇到了一个问题。我的项目不会编译,因为它在我调用的任何头文件中都找不到子头文件的目录。
例如,如果包含highgui.hpp并尝试编译我的程序,它将抛出一个错误,说明opencv2/core/cvdef.h、opencv2/core/base.hpp或open/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安装文件夹中gcc和g++的位置(。
在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文件中的子标题的路径包括为LIBS和INCLUDEPATH
- 正在重新启动我的计算机
从这里我不知道该去哪里。我真的很想为我的项目创建一个漂亮的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.hpp
和core.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`
现在一切都很好。再次感谢大家的帮助。如果可以的话,我会把赏金平均分配给这条线上的每个人。
- 创建 OpenCV 非自由版本 v4.3 时出错,可折叠.cpp错误 C2039、2605
- 在opencv中创建4x4垫矩阵时出错
- Gtk+ 3 使用 OpenCV 编译时出错
- Caffe Net.Forward 尝试使用 OpenCV 进行人脸检测时出错
- 尝试从 Github 编译 OpenCV QT 代码时出错
- OpenCV 加载 yaml 文件时出错
- 使用OPENCV 3.4加载CNN TensorFlow模型时出错
- 构建 OpenCV 时出错:"recompile with -fPIC"
- 在Ubuntu中使用VideOwriter(OpenCV)保存视频作为MP4时出错
- 在Debian上编译OpenCV(C++)时出错
- 使用CUDA编译OpenCV示例程序时出错
- 使用Inrange后,从HSV转换为BGR或OPENCV中的HSV到JPEG时出错
- 使用 OpenCV 保存 .pgm 图像时出错
- 制作 OpenCV 时出错
- 将calcOpticalFlowPyrLK与OpenCV 2.3.1一起使用时出错
- 调用功能 / C 和OPENCV时会出错
- Glibcxx 编译 FREAK OpenCV 演示文件时出错
- OpenCV C++代码在终端中运行良好,但在从Ubuntu 12.04运行时出错
- 使用CMake编译OpenCV项目时出错
- 使用cv::Mat.submat opencv时出错