QT Creator +cmake+MSVC2017 64bit
Libtorch1.8.1+opencv+realsense sdk+加载用vs封装的lib库_配置
文章目录
前言:
使用qt做界面,并调用opencv、libtorch等库,有多种方式。
我尝试了以下三种方式,并成功运行:
(1) 另一篇讲的
QT Creator +qmake
+MSVC2017_64bit + Libtorch1.8.1+opencv+realsense sdk配置+调用vs封装的lib库的方式
(配置opencv、libtorch和realsense sdk头文件和库,是在.pro文件,用MSVC2017 64bit编译)
(2)另一篇讲的
vs2017-QT VS Tools
搭建opencv+libtorch+realsense sdk+调用vs封装的lib库
和
安装配置方法
(配置opencv、libtorch和realsense sdk头文件和库,是在项目->属性,配置包含目录、库目录、链接器等等)
(3) 下面要讲的
QT Creator+CMake
+opencv+libtorch+realsense sdk+加载用vs封装的lib库的方式
(配置opencv、libtorch和realsense sdk头文件和库,
是在CMakeList.txt文件,用MSVC2017 64bit编译
)
一、QT、CMake、libtorch安装配置
1、QT安装
(已经在我前面的文章中有介绍过)
安装链接:
QT的直接下载地址
:
也可以直接从官网下载。
安装时勾选根据需要勾选MSVC选项:
安装QT完成后,添加系统环境变量,在Path变量一栏添加下面的路径:
2、安装CMake
下载地址
根据自己的系统,选择合适的版本。
安装CMake完成后,添加系统环境变量,在Path变量一栏添加下面的路径:
3、libtorch安装配置
一. 下载LibTorch
从官网下载编译好的文件-最新编译版本
:
以前编译的版本:
我现在用的是libtorch1.8.1,有两种版本可以选择分别是:“release和“debug”,我选择是:
现在后,
解压
到自己的目录下。
添加系统环境变量,在Path变量一栏添加下面的路径:
4、CDB调试工具下载
参考我的文章
安装visual studio 时或安装后找到安装目录找到点击vs_installer.exe文件进行修改
安装windows SDK,则安装了cdb调试工具
在windows kits文件夹下查找cdb.exe,我的安装路径在:
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe
也可以参考其他方式安装,如下参考:
参考链接
:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/
如下:
Windows 调试工具(WinDbg、KD、CDB、NTSD)
解 Windows 调试工具。 此工具集包括 WinDbg 和其他调试程序。
安装 Windows 调试工具
可以将 Windows 调试工具作为开发工具包的一部分或作为独立的工具集进行获取:
(1) 作为 WDK 的一部分
Windows 调试工具包含在 Windows 驱动程序工具包 (WDK) 中。 若要获取 WDK,
请参阅下载 Windows 驱动程序工具包 (WDK)
。
(2) 作为 Windows SDK 的一部分
Windows 调试工具包含在 Windows 软件开发工具包 (SDK) 中。 若要下载安装程序或 ISO 映像,
请参阅 Windows 开发人员中心上的 Windows 10 SDK
。
(3) 作为独立工具集
可以单独安装 Windows 调试工具而不安装 Windows SDK 或 WDK,方法是启动 Windows SDK 的安装,然后在要安装的功能列表中仅选择“Windows 调试工具”(并清除所有其他功能的选择)。 若要下载安装程序或 ISO 映像,
请参阅 Windows 开发人员中心上的 Windows 10 SDK
。
5、opencv安装和realsense sdk安装
opencv安装,直接从
官网
下载安装即可。在官网最上面一栏有“Library”,点击,选择“Releases”,会看到各种版本,根据自己的需要,选择下载。windows则选择windows版本下载安装即可。
Release各
版本链接
realsense sdk安装:
下载链接
,根据需要选择不同的版本,如下载Intel® RealSense™ SDK 2.0 (v2.49.0),我选择的是Intel.RealSense.SDK-WIN10-2.49.0.3474.exe:
二、新建QT工程
打开Qt Creator,
文件
->
新建文件或项目
:
注:此处的Compiler的C: 和C++处都选择“Microsoft Visual C++ Compiler 15.0 (amd64)”
Debugger选择cdb.exe,这个需要下载
,前面工具下载已经讲解过。
运行工程:
出现问题:“qt creator 无法找到执行档 请指定一个”:
参考:https://blog.csdn.net/weixin_47320074/article/details/119008180
分别运行release和debug,编译后在工程test同目录下有两个文件夹如:
在上图弹出的对话框“浏览”按键处,如果是执行debug,则选择:
如果是执行release,则选择:
设置完成后,再次执行debug或release,运行结果正确:
三、qt creator下配置libtorch
1、CMakeLists.txt文件
cmake_minimum_required(VERSION 3.5)
project(test LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.
#if(ANDROID)
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
# if (ANDROID_ABI STREQUAL "armeabi-v7a")
# set(ANDROID_EXTRA_LIBS
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
# endif()
#endif()
find_package(Qt5 COMPONENTS Widgets REQUIRED)
set(Torch_DIR "D:/libtorch-win-shared-with-deps-1.8.1+cpu/libtorch/share/cmake/Torch")
find_package(Torch REQUIRED)
include_directories(${TORCH_INCLUDE_DIRS})
if(ANDROID)
add_library(test SHARED
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
else()
add_executable(test
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
endif()
#target_link_libraries(test PRIVATE Qt5::Widgets)
target_link_libraries(test Qt5::Widgets ${TORCH_LIBRARIES})
在原来的CMakeLists.txt文件中做了两处修改:
修改CMakeLists.txt文件后,保存,项目会自动Configuring和Generating。
2、在mainwindow.cpp中添加libtorch的头文件:
#undef slots
#include <torch/torch.h>
#include <torch/script.h>
#define slots Q_SLOTS
添加位置在文件的最前面:
3、运行项目,成功:
四、qt creator下配置opencv
1、CMakeLists.txt文件
cmake_minimum_required(VERSION 3.5)
project(test LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.
#if(ANDROID)
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
# if (ANDROID_ABI STREQUAL "armeabi-v7a")
# set(ANDROID_EXTRA_LIBS
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
# endif()
#endif()
find_package(Qt5 COMPONENTS Widgets REQUIRED)
set(Torch_DIR "D:/libtorch-win-shared-with-deps-1.8.1+cpu/libtorch/share/cmake/Torch")
find_package(Torch REQUIRED)
include_directories(${TORCH_INCLUDE_DIRS})
set(OpenCV_DIR "D:/OpenCV/opencv-3.4.1-vc14_vc15/opencv/build/x64/vc14/lib")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
if(ANDROID)
add_library(test SHARED
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
else()
add_executable(test
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
endif()
#target_link_libraries(test PRIVATE Qt5::Widgets)
target_link_libraries(test Qt5::Widgets ${TORCH_LIBRARIES} ${OpenCV_LIBS})
在原来的CMakeLists.txt文件中做了两处修改:
修改CMakeLists.txt文件后,保存,项目会自动Configuring和Generating。
2、在mainwindow.cpp中添加opencv的头文件:
#include <opencv2/opencv.hpp>
添加位置:
3、运行项目,成功:
以上完成了使用qt_creatot和CMake,加载opencv、libtorch库,下面加载realsense SDK,读取视频。
五、qt creator下配置realsense SDK
1、CMakeLists.txt文件
cmake_minimum_required(VERSION 3.5)
project(test LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
#set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.
#if(ANDROID)
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
# if (ANDROID_ABI STREQUAL "armeabi-v7a")
# set(ANDROID_EXTRA_LIBS
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
# endif()
#endif()
find_package(Qt5 COMPONENTS Widgets REQUIRED)
set(Torch_DIR "D:/libtorch-win-shared-with-deps-1.8.1+cpu/libtorch/share/cmake/Torch")
find_package(Torch REQUIRED)
include_directories(${TORCH_INCLUDE_DIRS})
set(OpenCV_DIR "D:/OpenCV/opencv-3.4.1-vc14_vc15/opencv/build/x64/vc14/lib")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
#-------------------------------------- 包含头文件 --------------------------------
include_directories("C:/Program Files (x86)/Intel RealSense SDK 2.0/include")
#-------------------------------------- 引入库文件 --------------------------------
link_directories("C:/Program Files (x86)/Intel RealSense SDK 2.0/lib/x64")
if(ANDROID)
add_library(test SHARED
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
else()
add_executable(test
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
endif()
#target_link_libraries(test PRIVATE Qt5::Widgets)
target_link_libraries(test Qt5::Widgets ${TORCH_LIBRARIES} ${OpenCV_LIBS} ${realsense2_LIBRARY} realsense2.lib)
在原来的CMakeLists.txt文件中做了两处修改:
修改CMakeLists.txt文件后,保存,项目会自动Configuring和Generating。
2、添加头文件
在mainwindow.cpp中添加realsense的头文件和opencv的头文件:
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<librealsense2/rs.hpp>
#include<librealsense2/rsutil.h>
using namespace std;
using namespace cv;
添加位置:
3、编辑控件
打开mainwindow.ui文件,也许你的文件命名不同,是项目里的.ui文件就可以。
将拖动Push Button和Label控件到需要编辑的窗口上。
在控件PushButton按钮上,右击,选择“转到槽”,选择clicked()函数:
在mainwindow.h文件,出现on_pushButton_clicked()函数的声明:
在mainwindow.cpp文件,出现on_pushButton_clicked()函数的定义:
4、编辑mainwindow.cpp代码
编辑mainwindow.cpp代码,读取realsense相机获取的图像:
在on_pushButton_clicked()函数中编辑代码,mainwindow.cpp的代码如下:
#undef slots
#include <torch/torch.h>
#include <torch/script.h>
#define slots Q_SLOTS
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<librealsense2/rs.hpp>
#include<librealsense2/rsutil.h>
#include "mainwindow.h"
#include "./ui_mainwindow.h"
using namespace std;
using namespace cv;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//创建数据管道
rs2::pipeline pipe;
rs2::config pipe_config;
pipe_config.enable_stream(RS2_STREAM_DEPTH,640,480,RS2_FORMAT_Z16,30);
pipe_config.enable_stream(RS2_STREAM_COLOR,640,480,RS2_FORMAT_BGR8,30);
//start()函数返回数据管道的profile
rs2::pipeline_profile profile = pipe.start(pipe_config);
//声明数据流
auto depth_stream=profile.get_stream(RS2_STREAM_DEPTH).as<rs2::video_stream_profile>();
auto color_stream=profile.get_stream(RS2_STREAM_COLOR).as<rs2::video_stream_profile>();
while(true)
{
//堵塞程序直到新的一帧捕获
rs2::frameset frameset = pipe.wait_for_frames();
//取深度图和彩色图
rs2::frame color_frame = frameset.get_color_frame();//processed.first(align_to);
//获取宽高
const int color_w=color_frame.as<rs2::video_frame>().get_width();
const int color_h=color_frame.as<rs2::video_frame>().get_height();
//创建OPENCV类型 并传入数据
Mat color_image(Size(color_w,color_h),
CV_8UC3,(void*)color_frame.get_data(),Mat::AUTO_STEP);
Mat temp;
QImage Qtemp;
cvtColor(color_image, temp, CV_BGR2RGB);//BGR convert to RGB
Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(Qtemp));
ui->label->resize(Qtemp.size());
ui->label->show();
imshow("color_image",color_image);
waitKey(10);
}
}
注:用控件显示图像有三种方法,我用的是Pixmap的方法,使用比较简单,但不够实时,通过和imshow()对比就可以看出来,这里只是演示,如果想实时显示读取的图像,自己再尝试其他显示方法。
5、运行项目
运行项目,出现问题,在QT creator窗口最下面菜单栏处“应用程序输出”出现,“程序结束”或.exe crash的提示。
最后,我想到可能是有realsense2.lib,但没有找到realsense2.dll。
打开我的realsense sdk的安装文件夹:
在CMakeList.txt文件中,有link_directories(“C:/Program Files (x86)/Intel RealSense SDK 2.0/lib/x64”),我做了两步操作:
(1) 将Intel RealSense SDK 2.0目录下,bin文件夹里面的realsense2.dll文件复制到lib文件夹下。(我用的是x64里面的,两个文件夹要对应)
(2) “C:\Program Files (x86)\Intel RealSense SDK 2.0\bin\x64”添加到系统环境变量中
完成该设置以后,在执行项目,成功:
六、qt creator下加载vs封装的.lib库
vs封装.lib的方法,在我前面的文章中有讲解,
链接地址
1、CMakeLists.txt文件
cmake_minimum_required(VERSION 3.5)
project(test LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
#set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.
#if(ANDROID)
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
# if (ANDROID_ABI STREQUAL "armeabi-v7a")
# set(ANDROID_EXTRA_LIBS
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
# endif()
#endif()
find_package(Qt5 COMPONENTS Widgets REQUIRED)
set(Torch_DIR "D:/libtorch-win-shared-with-deps-1.8.1+cpu/libtorch/share/cmake/Torch")
find_package(Torch REQUIRED)
include_directories(${TORCH_INCLUDE_DIRS})
set(OpenCV_DIR "D:/OpenCV/opencv-3.4.1-vc14_vc15/opencv/build/x64/vc14/lib")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories("C:/Program Files (x86)/Intel RealSense SDK 2.0/include")
link_directories("C:/Program Files (x86)/Intel RealSense SDK 2.0/lib/x64")
include_directories("D:/software/test/include")
link_directories("D:/software/test/lib")
if(ANDROID)
add_library(test SHARED
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
else()
add_executable(test
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
endif()
#target_link_libraries(test PRIVATE Qt5::Widgets)
target_link_libraries(test Qt5::Widgets ${TORCH_LIBRARIES} ${OpenCV_LIBS} ${realsense2_LIBRARY} realsense2.lib DetectRs.lib)
在原来的CMakeLists.txt文件中做了两处修改:
分别添加的是:封装库的头文件的路径和封装库的.lib和.dll的路径;修改的是最后一行链接库中加入封装的.lib的名称DetectRs.lib。
修改CMakeLists.txt文件后,保存,项目会自动Configuring和Generating。
2、添加头文件
在mainwindow.cpp中添加封装库的头文件:
#include "detector.h"
#include "rs.h"
3、编辑mainwindow.cpp代码
编辑mainwindow.cpp代码,调用封装的.lib库中的函数,此处根据自己的函数定义进行调用。
//#undef slots
//#include <torch/torch.h>
//#include <torch/script.h>
//#define slots Q_SLOTS
//#include<opencv2/imgproc/imgproc.hpp>
//#include<opencv2/core/core.hpp>
//#include<opencv2/highgui/highgui.hpp>
//#include<librealsense2/rs.hpp>
//#include<librealsense2/rsutil.h>
//using namespace std;
//using namespace cv;
//因为封装库里的头文件已经包含了libtorch和opencv的相关头文件,所以这里就可以注释掉,只包含封装库的头文件即可
#include "detector.h"
#include "rs.h"
#include "mainwindow.h"
#include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
// 加载数据分类的名称
std::vector<std::string> class_names = LoadNames("D:\\software\\test\\weights\\class.names");
if (class_names.empty()) {
return;
}
// 加载模型
std::string weights = "D:\\software\\test\\weights\\model.torchscript.pt";
// set device type - CPU/GPU
torch::DeviceType device_type;
device_type = torch::kCPU;
//封装库的类的初始化函数
auto detector = Detector(weights, device_type);
//定义结构体
realsenseData rsData;
realsenseInit(rsData);//调用封装库里的函数。
}
4、运行项目
当我执行项目时,会提示程序异常结束。如下:
后来我发现,在用vs生成.lib库时,
建立具有导出项的(DLL)动态链接库的项目时
,自动生成了”pch.h”和“framework.h”这两个头文件,我并且include到了我的.cpp文件里,因此如果在QT项目工程目录封装库的include文件夹下没有这两个文件,就会提示上面的错误。因此将”pch.h”和“framework.h”这两个头文件复制到QT项目工程目录封装库的include文件夹下,在需要调用库函数的mainwindow.cpp的开头包含这两个头文件,不需要包含”pch.h”和“framework.h”。
即只在mainwindow.cpp加如下头文件即可:
#include "detector.h"
#include "rs.h"
(如果你用vs工程封装.lib库时,在定义函数的.cpp文件里面,包含了”pch.h”和“framework.h”这两个头文件。
(1)
在QT工程下
,调用库的函数时,工程目录的包含路径下
必须有这两个头文件
,实际编写代码是
不用include
这两个文件;
(2)
在VS工程下
,调用库的函数时,工程目录的包含路径下
不需要有这两个头文件
,实际编写代码时
也不用include
这两个文件;)
因此将”pch.h”和“framework.h”这两个头文件复制到QT项目工程目录封装库的include文件夹下后,
再次运行项目,成功:
打印出输出结果。