目录
1、使用平台以及版本
qt 版本5.15.2 编译器 MSVC2019
使用环境:windows平台 w10 qt creator
2、如何添加opencv的库
我使用的是opencv库的适用于编译器msvc2019的,我用是的cmake编辑的,用动态库的方式添加到qt中。
bin目录下添加dll以及lib文件,如果是release的话就是xxx.dll,以及xxx.lib,如果的debug的情况一般情况都是xxxd.dll,xxxd.lib注意区分,一般情况下,都是这两种都添加到bin下,如下:
在include中存放所有的头文件,
准备好了这些东西之后,就可以在qt的pro文件中添加opencv的库了。
note:我这个lib文件,是我用opencv的源码用cmake编译的,当然你也可以直接下载好别人编译好的,VS2019添加的方法类似,都是添加include和bin的路径,然后将对应的lib文件添加进去。
3、如何在qt中添加opencv的库
这里我用的是qmake,我用的是debug模式。
点击项目文件->右键->添加库,
把bin路径添加进去
debug模式选择xxxd.lib,release选择xxx.lib
将下面的bin改成include
点确定就可以自动生成代码。
当然你也可以直接复制第一个框框类的代码,最后都是要生成这几句话。
#添加opencv的库
#使用$$PWD变量来创建相对路径
#$$PWD变量所创建的相对路径是相对于Qt项目文件(通常是.pro文件)
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../common/open2019qt/bin/ -lopencv_world412
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../common/open2019qt/bin/ -lopencv_world412d
INCLUDEPATH += $$PWD/../../common/open2019qt/include
DEPENDPATH += $$PWD/../../common/open2019qt/include
4、怎么看你有没有添加成功
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
可以试试添加头文件,运行不报错,也就添加成功了。
5、编写代码,实现晴雨雾雪的效果
注意:opencv的库是标准的c++代码,在qt中显示的时候需要经过转换
如果出现问题,试试添加这行代码,因为opencv是标准c++代码。
完整的图片:
printsupport 这个应该是c的print打印支持。
到这里所有准备工作完成了。
6、代码部分
都知道opencv是对图像进行处理的,我的目的就是达到实现摄像头的仿真效果。
void yourclass::initdisplayImage()
{
// // 加载图像,这里假设图像文件名为 "image.jpg"
// QString pixpath = QApplication::applicationDirPath()+"/pictrue/qing.png";
// std::string imagePath = pixpath.toStdString();
// image = cv::imread(imagePath);
// // 定义裁剪区域
// cv::Rect regionOfInterest(0,0,1000, 500);
// //x 是矩形的左上角的 x 坐标。
// // y 是矩形的左上角的 y 坐标。
// // width 是矩形的宽度。
// //height 是矩形的高度
// // 裁剪图像
// cv::Mat croppedImage = image(regionOfInterest);
// if (!image.empty()) {
// // 将OpenCV图像转换为Qt图像
// QImage qImage(croppedImage.data, croppedImage.cols, croppedImage.rows, croppedImage.step, QImage::Format_BGR888);
// // 将Qt图像显示在QLabel中
// ui->label_3->setPixmap(QPixmap::fromImage(qImage));
// ui->label_3->setScaledContents(true); // 可选:自动缩放图像以适应QLabel
// } else {
// qDebug() << "无法加载图像";
// }
}
这是简单的显示一张图片,在label中显示一张图片。
因为我想在得到一个信号,显示不同的照片所有我更改了写法。
note:opencv的rgb也就是跟qt的rgb的r通道和g通道,红绿蓝三原色,红绿的通道是反的,所以代码需要修改一下。
这是显示效果,上下左右键可以调整裁剪区域。
相当于调整摄像头的方向,左右,上下方向。
晴:
像素是4000*2000;
这个是我自己在ps中p出来的,
雨
开始用代码实现雨的效果,雨出来就是蓝色的,透明通道一直没有生效,rgba,我把图片改成png格式也不知道为什么不行。
雪:
后来直接用ps直接p出来这个效果,四张照片都是4000*2000像素的。
显示照片的通用函数:
void Yourclass::loadBackgroundImage(const QString& imagePath) {
std::string imageFilePath = imagePath.toStdString();
image = cv::imread(imageFilePath);
// 定义裁剪区域
cv::Rect regionOfInterest(currentX,currentY,1000, 500);
//x 是矩形的左上角的 x 坐标。
// y 是矩形的左上角的 y 坐标。
// width 是矩形的宽度。
//height 是矩形的高度
// 裁剪图像
cv::Mat croppedImage = image(regionOfInterest);
if (!image.empty()) {
// 将OpenCV图像转换为Qt图像
QImage qImage(croppedImage.data, croppedImage.cols, croppedImage.rows, croppedImage.step, QImage::Format_BGR888);
// 将Qt图像显示在QLabel中
ui->label_3->setPixmap(QPixmap::fromImage(qImage));
ui->label_3->setScaledContents(true); // 可选:自动缩放图像以适应QLabel
} else {
qDebug() << "无法加载背景图像";
}
}
需要在头文件声明:
//opencv
// 定义全局变量用于存储当前裁剪区域的 y 坐标
int currentX=0;
int currentY = 1500;
void updateImage();
cv::Mat image; // 将图像声明为类的成员变量
void loadBackgroundImage(const QString& imagePath);
晴雨雾雪效果:
槽函数
void yourclass::RainWeatherEffect()
{
loadBackgroundImage(QApplication::applicationDirPath() + "/pictrue/555yu.jpg");
}
void yourclass::SunWeatherEffect()
{
loadBackgroundImage(QApplication::applicationDirPath() + "/pictrue/qing.jpg");
}
void yourclass::FogWeatherEffect()
{
loadBackgroundImage(QApplication::applicationDirPath() + "/pictrue/wu.jpg");
}
void yourclass::SnowWeatherEffect()
{
loadBackgroundImage(QApplication::applicationDirPath() + "/pictrue/555snow.jpg");
}
实现上下左右移动:
void yourclass::onMoveDownButtonClicked() {
// 向下平移,例如每次平移 100 像素
currentY += 100;
if(currentY>=1500)
{
currentY=1500;
}
updateImage();
}
void yourclass::onMoveLeftButtonClicked() {
currentX -= 100;
if (currentX < 0) {
currentX = 0;
}
updateImage();
}
void yourclass::onMoveRightButtonClicked() {
currentX += 100;
if (currentX >= image.cols - 1000) {
currentX = image.cols - 1000;
}
updateImage();
}
void yourclass::updateImage() {
// 重新设置裁剪区域的坐标
cv::Rect regionOfInterest(currentX, currentY, 1000, 500);
// 裁剪图像
cv::Mat croppedImage = image(regionOfInterest);
if (!croppedImage.empty()) {
// 将裁剪后的图像转换为 Qt 图像
QImage qImage(croppedImage.data, croppedImage.cols, croppedImage.rows, croppedImage.step, QImage::Format_BGR888);
// 显示在 QLabel 中
ui->label_3->setPixmap(QPixmap::fromImage(qImage));
ui->label_3->setScaledContents(true);
} else {
qDebug() << "无法加载图像";
}
}
7、总结
是可以直接用代码实现雨和雪效果的,但是呢,雨的透明通道问题一直没有解决,出来的雨的效果不是很好,所以就直接用ps实现了。
这是本人原创,不允许转载,谢谢。