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的直接下载地址:
也可以直接从官网下载。
安装时勾选根据需要勾选MSVC选项:
安装QT完成后,添加系统环境变量,在Path变量一栏添加下面的路径:
下载地址
根据自己的系统,选择合适的版本。
安装CMake完成后,添加系统环境变量,在Path变量一栏添加下面的路径:
一. 下载LibTorch
从官网下载编译好的文件-最新编译版本:
以前编译的版本:
我现在用的是libtorch1.8.1,有两种版本可以选择分别是:“release和“debug”,我选择是:
现在后,解压到自己的目录下。
添加系统环境变量,在Path变量一栏添加下面的路径:
参考我的文章安装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。
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 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,运行结果正确:
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。
#undef slots
#include
#include
#define slots Q_SLOTS
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文件后,保存,项目会自动Configuring和Generating。
#include
以上完成了使用qt_creatot和CMake,加载opencv、libtorch库,下面加载realsense SDK,读取视频。
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。
在mainwindow.cpp中添加realsense的头文件和opencv的头文件:
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
打开mainwindow.ui文件,也许你的文件命名不同,是项目里的.ui文件就可以。
将拖动Push Button和Label控件到需要编辑的窗口上。
在控件PushButton按钮上,右击,选择“转到槽”,选择clicked()函数:
在mainwindow.h文件,出现on_pushButton_clicked()函数的声明:
在mainwindow.cpp文件,出现on_pushButton_clicked()函数的定义:
编辑mainwindow.cpp代码,读取realsense相机获取的图像:
在on_pushButton_clicked()函数中编辑代码,mainwindow.cpp的代码如下:
#undef slots
#include
#include
#define slots Q_SLOTS
#include
#include
#include
#include
#include
#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()对比就可以看出来,这里只是演示,如果想实时显示读取的图像,自己再尝试其他显示方法。
运行项目,出现问题,在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”添加到系统环境变量中
完成该设置以后,在执行项目,成功:
vs封装.lib的方法,在我前面的文章中有讲解,链接地址
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。
在mainwindow.cpp中添加封装库的头文件:
#include "detector.h"
#include "rs.h"
编辑mainwindow.cpp代码,调用封装的.lib库中的函数,此处根据自己的函数定义进行调用。
//#undef slots
//#include
//#include
//#define slots Q_SLOTS
//#include
//#include
//#include
//#include
//#include
//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);//调用封装库里的函数。
}
当我执行项目时,会提示程序异常结束。如下:
后来我发现,在用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文件夹下后,再次运行项目,成功:
打印出输出结果。