Qt+openCV的小项目---晴雨雾雪效果

14 篇文章 0 订阅
4 篇文章 0 订阅

目录

1、使用平台以及版本

2、如何添加opencv的库

3、如何在qt中添加opencv的库

4、怎么看你有没有添加成功

5、编写代码,实现晴雨雾雪的效果

6、代码部分

7、总结


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实现了。

这是本人原创,不允许转载,谢谢。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值