QT与Opencv的联合应用

使用QT平台,对opencv c++的模糊化和灰度化进行复现,并将运行的代码封装成exe文件,可以移植到,另外的电脑上进行运行。其中对另外的电脑配置要求不需要安装QT,也不需要安装opencv,也能实现同样的功能。

 下面这是最终的一个简单的效果图。

              最终效果

目录

一、环境配置

二、界面介绍

三、开始搭建用户ui界面



一、环境配置

首先,我所使用的版本配置是:QT为5.12.9,opencv c++的版本是4.5.1

 这里安装软件的参考链接放到下面了,供大家参考:

http://download.qt.io/                                                           QT软件安装网址

https://opencv.org/releases/                                                 opencv c++下载网址

具体的安装方式其他博客都有介绍,这里就不过多讲解了。--如果有安装问题,可以评论区询问

二、界面介绍

首先是QT的界面如下图所示:

打开安装好的QT Creator即可

然后可以开始第一次QT的文件,首先点击右上角文件-->点击新建-->applicatiion(qt)-->QT widgets application.进行创建。

 然后点击choose进行下一步,如图所示:

 名称可以自已随意修改(不要出现中文),这里就默认了,注意修改路径,然后点击下一步:

 在这里,下拉选择qmake,如果用VSc++编程的话,就使用cmake.然后点击下一步,

在这里要勾选generate form,为了后面使用ui界面做准备

 然后再点击下一步,后面这一页默认即可,然后根据你用的电脑,一般选64位,两个选一个即可。

 然后点击下一步-->完成即可。

这样你的第一个QT就新建完成了。

三、开始搭建用户ui界面

这里的三个地方,进行一个说明,1处是你建立的项目文件,2处是使用所需的头文件,3处是编写的.c文件,4处是进行可视化,简单页面编辑的地方。下面我们将一一来使用。

首先,点击上面图片的圈出来的第4个地方,打开后就如下面这张图片所示,然后用鼠标拖动label控件到指定位置,点击编辑输入:hello world

 然后再点击左下角绿色的三角符号,你就会得到第一个QT程序,如下图所示:

接下来,开始将opencv库导入到QT项目里面,过程如下:

opencv的安装,本文就不在阐述。直接进入正题,导入opencv,在.pro文件里面写以下部分代码,然后重新构建。

win32:CONFIG(release, debug|release): LIBS += -L你的opencv安装路径/build/x64/vc15/lib/ -lopencv_world451
else:win32:CONFIG(debug, debug|release): LIBS += -L你的opencv安装路径/build/x64/vc15/lib/ -lopencv_world451d
else:unix: LIBS += -L你的opencv安装路径/build/x64/vc15/lib/ -lopencv_world451

INCLUDEPATH += 你的opencv安装路径/build/include
DEPENDPATH += 你的opencv安装路径/build/include

然后就拖动控件,我的界面参考如下 ,主要是pushbutton和label

然后就编写代码,主要功能实现部分代码如下:

#include "opencv_basic.h"
#include "ui_opencv_basic.h"
#include <QDir>
#include <QDebug>
#include <iostream>
#include <QString>//字符串转换操作
#include <QMessageBox>//添加警告框
#include <QFileDialog>//添加自选文件夹
#pragma execution_character_set("utf-8")

opencv_basic::opencv_basic(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::opencv_basic)
{
    ui->setupUi(this);
    //on_pushButton_clicked();
}

QString path = "F:/test_images/";

opencv_basic::~opencv_basic()
{
    delete ui;
}

int i=0;


//读取绝对路径下的第一张图片的路径并且返回
std::string file_read(int &i)
{
/*可以读取绝对路径下的第一张图片*/
//获取应用程序可执行文件的文件路径:    //QDir::currentPath();//获取当前工程目录
QDir dir(path);
QStringList filename ;
filename << "*.png" << "*.jpg";//可叠加,可使用通配符筛选
QStringList results;
results = dir.entryList(filename,QDir::Files | QDir::Readable,QDir::Name);

//增加一个判定
int a=results.size();
//qDebug()<<a;打印出来有几张图片
qDebug()<<"i"<<i;
if(i+1>a)
{
    QWidget *parent=new QWidget;
    QMessageBox::information(parent,u8"提示",u8"图片读取错误",u8"确定",u8"取消");
    qDebug()<<i;
    i--;//回到上一张
}

//qDebug()<<results;//results里就是获取的所有文件名了,这里的qdebug是将运行的路径进行输出
QString st=results.at(i);
QString rt=path;
qDebug()<<rt+st;
std::string str1=rt.toStdString();
std::string str2 = st.toStdString();
std::string str3=str1+str2;
return str3;
}

//这个函数是显示原图,值得注意的是,在转化8位3通道的图像时,OpenCV和QImage使用的红蓝通道是相反的,需要使用rgbSwapped方法互换一下
void opencv_basic::on_pushButton_clicked()
{
    std::string str3=file_read(i);
    cv::Mat srcimage=cv::imread(str3);
    /*--------------------------------------------------------*/
   // cv::Mat srcimage=cv::imread("../opencv_basic/2.jpg");
    //cv::imshow("原始图片",src);R
    //Mat转QImage 像素   oldlabel放置原图
       QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
       QImage imag =disimage.rgbSwapped();//将红蓝通道对换
       disimage = imag.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);
       ui->label->setPixmap(QPixmap::fromImage(disimage));
}

//这个函数是对图像进行模糊化和灰度化
void opencv_basic::on_pushButton_2_clicked()
{
    std::string str3=file_read(i);
    cv::Mat srcimage=cv::imread(str3);
    //cv::imshow("原始图片",src);
    cv::Mat img_resize,img_Gray,img_blur;
    //cv::resize(srcimage, img_resize,cv::Size(), 0.5, 0.5);
    cvtColor(srcimage, img_Gray, cv::COLOR_BGR2GRAY);
    GaussianBlur(img_Gray, img_blur, cv::Size(3, 3), -1, -1);//高斯模糊化

    //Mat转QImage 像素   oldlabel放置原图
      // QImage disimage = QImage(img_blur.data,img_blur.cols,img_blur.rows,img_blur.cols*img_blur.channels(),QImage::Format_Grayscale8);
    //Mat转QImage 像素   oldlabel放置灰度图
    QImage disimage = QImage(img_blur.data,img_blur.cols,img_blur.rows,img_blur.cols*img_blur.channels(),QImage::Format_Grayscale8);
    ui->label_2->setPixmap(QPixmap::fromImage(disimage.scaled(ui->label_2->width(),ui->label_2->height(),Qt::KeepAspectRatio)));//,Qt::KeepAspectRatio在后面加上这个就可以保证图片不变形
}

//下一张的按键
void opencv_basic::on_pushButton_4_clicked()
{
    i++;
    file_read(i);
}

//上一张的按键
void opencv_basic::on_pushButton_5_clicked()
{
    i--;
    if(i<=0)
    {
        i=0;
    }
    file_read(i);
}

//增加一个警告框用来提示是否存在文件夹,如果没有就创建
void opencv_basic::on_pushButton_3_clicked()
{
       QDir *temp = new QDir;
       bool exist = temp->exists("F:/test_images");
       if(exist)
        {// QMessageBox::warning(this,"创建文件夹","文件夹已经存在!");//会显示中文乱码
          QMessageBox::information(this,u8"提示",u8"创建成功",u8"确定",u8"取消");
       }
       else
       {
           bool ok = temp->mkdir("F:/test_images");
           if( ok )
              // QMessageBox::warning(this,"创建文件夹","文件夹创建成功!");
           QMessageBox::information(this,u8"提示",u8"创建失败!",u8"确定",u8"取消");
       }

}

void opencv_basic::on_action_triggered()
{
    path = QFileDialog::getExistingDirectory(this,"请选择要打开文件路径","./");
    qDebug()<<"filename : "<<path;
}

  • 6
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL中的Redo Log、Binlog和Undo Log是三种不同的日志类型,用于支持数据库事务的持久性、复制和回滚操作。 1. Redo Log(重做日志): Redo Log是MySQL引擎内部使用的一种日志,记录了所有已提交的修改操作,以保证数据库在发生崩溃等异常情况下能够进行恢复。当数据库发生崩溃时,可以通过Redo Log来重放这些修改操作,使数据库恢复到崩溃前的状态。Redo Log是在InnoDB存储引擎中实现的,通常以磁盘文件形式存在,可被视为一种类似于事务日志的机制。 2. Binlog(二进制日志): Binlog是MySQL数据库服务器层产生的一种日志,用于记录数据库中所有的修改操作,包括数据修改和数据定义语句(DDL)。与Redo Log不同,Binlog记录的是逻辑操作而不是物理操作,以提供对数据的逻辑复制和恢复能力。Binlog通常以二进制文件的形式存在,并且可以被用于主从复制和数据恢复等任务。 3. Undo Log(回滚日志): Undo Log是用于支持事务回滚操作的一种日志。当一个事务执行修改操作时,旧值会被记录在Undo Log中,以便于回滚操作时能够恢复到之前的状态。Undo Log通常与事务的隔离级别和并发控制有关,主要用于MVCC(多版本并发控制)的实现。 这三种日志在MySQL中扮演了不同角色,分别用于保证数据的持久性、支持复制和提供事务回滚功能。在数据库的正常运行和异常恢复中起到至关重要的作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Helloorld_11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值