怎么使用OpenCV+Qt实现图像处理操作工具

这篇文章主要介绍“怎么使用OpenCV+Qt实现图像处理操作工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用OpenCV+Qt实现图像处理操作工具”文章能帮助大家解决问

这篇文章主要介绍“怎么使用OpenCV+Qt实现图像处理操作工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用OpenCV+Qt实现图像处理操作工具”文章能帮助大家解决问题。

一、目标

Qt界面实现 雪花屏 高斯模糊 中值滤波 毛玻璃 灰度化 XY方向模糊 双边模糊 腐蚀 [图像处理操作]

要求左边原图,右边效果图

结果展示如下:[图像处理实现有点多,就不一个一个地展示了,各别展示如下]

雪花屏

怎么使用OpenCV+Qt实现图像处理操作工具

毛玻璃

怎么使用OpenCV+Qt实现图像处理操作工具

灰度化处理

怎么使用OpenCV+Qt实现图像处理操作工具

二、使用Qt界面

使用到Qt中的UI设计界面

怎么使用OpenCV+Qt实现图像处理操作工具

设计好界面之后最好先保存

对每一个按钮设计槽函数

怎么使用OpenCV+Qt实现图像处理操作工具

三、图像处理操作完整代码

难点在于:Qt是QImage而OpenCV是Mat,需要Mat转QImage才能在Qt界面中进行图片的正常显示

怎么使用OpenCV+Qt实现图像处理操作工具

头文件中导入opencv包 

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include<opencv2/opencv.hpp>
  4. #include <QWidget>
  5. using namespace cv;
  6.  
  7. QT_BEGIN_NAMESPACE
  8. namespace Ui {class Widget;}
  9. QT_END_NAMESPACE
  10.  
  11. class Widget : public QWidget
  12. {
  13.     Q_OBJECT
  14. public:
  15. //  Widget(QWidget *parent = nullptr);
  16.     explicit Widget(QWidget *parent = 0);
  17.     ~Widget();
  18.  
  19. private slots:
  20.     void on_pushButton_clicked();//雪花屏
  21.     void on_pushButton_2_clicked();//高斯模糊
  22.     void on_pushButton_3_clicked();//中值滤波
  23.     void on_pushButton_4_clicked();//毛玻璃
  24.     void on_pushButton_5_clicked();//灰度化
  25.     void on_pushButton_6_clicked();//XY方向模糊
  26.     void on_pushButton_7_clicked();//双边模糊
  27.     void on_pushButton_8_clicked();//腐蚀
  28. private:
  29.     Ui::Widget *ui;
  30.     Mat srcimage;//原图
  31. };
  32.  
  33. #endif // WIDGET_H

源文件中实现图像处理方法 

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3.  
  4. Widget::Widget(QWidget *parent) :
  5.     QWidget(parent),
  6.     ui(new Ui::Widget)
  7. {
  8.     ui->setupUi(this);
  9. }
  10.  
  11. Widget::~Widget()
  12. {
  13.     delete ui;
  14. }
  15.  
  16. //雪花屏
  17. void Widget::on_pushButton_clicked()
  18. {
  19.     //读取原始图片
  20.     Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
  21.     //Mat转QImage 颜色
  22.     cvtColor(srcimage,srcimage,CV_BGR2RGB);
  23.     //Mat转QImage 像素   oldlabel放置原图
  24.     QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
  25.     disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
  26.     ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
  27.  
  28.     //像素二维矩阵函数
  29.     int rows = srcimage.rows;
  30.     //像素二维矩阵列数
  31.     int cols = srcimage.cols * srcimage.channels();
  32.     for(int i=0;i<rows;i++)
  33.     {
  34.         uchar * data = srcimage.ptr<uchar>(i);
  35.         for(int j=0;j<cols;j++)
  36.         {
  37.             //雪花屏特效
  38.             int q = rand()%cols;
  39.             data[q]=155;//某些通道随机改成155
  40.         }
  41.     }
  42.     //Mat转QImage 像素   newlabel放置图像处理后图片
  43.     QImage disimage2 = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
  44.     disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
  45.     ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
  46. }
  47.  
  48. //高斯模糊
  49. void Widget::on_pushButton_2_clicked()
  50. {
  51.     //读取原始图片
  52.     Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
  53.     //Mat转QImage 颜色
  54.     cvtColor(srcimage,srcimage,CV_BGR2RGB);
  55.     //Mat转QImage 像素   oldlabel放置原图
  56.     QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
  57.  
  58.     Mat retimage;
  59.     //高斯模糊
  60.     GaussianBlur(srcimage,retimage,Size(5,5),0,0);
  61.  
  62.     //Mat转QImage 像素   newlabel放置图像处理后图片
  63.     QImage disimage2 = QImage(retimage.data,retimage.cols,retimage.rows,retimage.cols*retimage.channels(),QImage::Format_RGB888);
  64.     disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
  65.     ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
  66. }
  67.  
  68. //中值滤波
  69. void Widget::on_pushButton_3_clicked()
  70. {
  71.     //读取原始图片
  72.     Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
  73.     //Mat转QImage 颜色
  74.     cvtColor(srcimage,srcimage,CV_BGR2RGB);
  75.     //Mat转QImage 像素   oldlabel放置原图
  76.     QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
  77.     disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
  78.     ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
  79.  
  80.     Mat retumage;
  81.     //中值滤波
  82.     medianBlur(srcimage,retumage,5);
  83.  
  84.     //Mat转QImage 像素   newlabel放置图像处理后图片
  85.     QImage disimage2 = QImage(retumage.data,retumage.cols,retumage.rows,retumage.cols*retumage.channels(),QImage::Format_RGB888);
  86.     disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
  87.     ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
  88. }
  89.  
  90. //毛玻璃
  91. void Widget::on_pushButton_4_clicked()
  92. {
  93.     //读取原始图片
  94.     Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
  95.     //Mat转QImage 颜色
  96.     cvtColor(srcimage,srcimage,CV_BGR2RGB);
  97.     //Mat转QImage 像素   oldlabel放置原图
  98.     QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
  99.     disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
  100.     ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
  101.  
  102.     //毛玻璃
  103.     RNG rng;
  104.     int random;
  105.     int num = 5;
  106.     for(int i=0;i<srcimage.rows -num;i++)
  107.     {
  108.         for(int j=0;j<srcimage.cols -num;j++)
  109.         {
  110.             //通过rng返回0-15随机数
  111.             random = rng.uniform(0,num);
  112.             srcimage.at<Vec3b>(i,j)[0] = srcimage.at<Vec3b>(i+random,j+random)[0];
  113.             srcimage.at<Vec3b>(i,j)[1] = srcimage.at<Vec3b>(i+random,j+random)[1];
  114.             srcimage.at<Vec3b>(i,j)[2] = srcimage.at<Vec3b>(i+random,j+random)[2];
  115.         }
  116.     }
  117.  
  118.     //Mat转QImage 像素   newlabel放置图像处理后图片
  119.     QImage disimage2 = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
  120.     disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
  121.     ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
  122. }
  123.  
  124. //灰度化
  125. void Widget::on_pushButton_5_clicked()
  126. {
  127.     //读取原始图片
  128.     Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
  129.     //Mat转QImage 颜色
  130.     cvtColor(srcimage,srcimage,CV_BGR2RGB);
  131.     //Mat转QImage 像素   oldlabel放置原图
  132.     QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
  133.     disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
  134.     ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
  135.  
  136.     Mat retumage;
  137.     //灰度处理 灰度是单通道8位 QImage是24位三通道
  138.     cvtColor(srcimage,retumage,CV_BGR2GRAY);
  139.     cvtColor(retumage,retumage,CV_GRAY2BGR);
  140.  
  141.     //Mat转QImage 像素   newlabel放置图像处理后图片
  142.     QImage disimage2 = QImage(retumage.data,retumage.cols,retumage.rows,retumage.cols*retumage.channels(),QImage::Format_RGB888);
  143.     disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
  144.     ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
  145. }
  146.  
  147. //XY方向模糊
  148. void Widget::on_pushButton_6_clicked()
  149. {
  150.     //读取原始图片
  151.     Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
  152.     //Mat转QImage 颜色
  153.     cvtColor(srcimage,srcimage,CV_BGR2RGB);
  154.     //Mat转QImage 像素   oldlabel放置原图
  155.     QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
  156.     disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
  157.     ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
  158.  
  159.     Mat retumage;
  160.     //xy轴模糊
  161.     blur(srcimage,retumage,Size(10,10));
  162.  
  163.     //Mat转QImage 像素   newlabel放置图像处理后图片
  164.     QImage disimage2 = QImage(retumage.data,retumage.cols,retumage.rows,retumage.cols*retumage.channels(),QImage::Format_RGB888);
  165.     disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
  166.     ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
  167. }
  168.  
  169. //双边模糊
  170. void Widget::on_pushButton_7_clicked()
  171. {
  172.     //读取原始图片
  173.     Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
  174.     //Mat转QImage 颜色
  175.     cvtColor(srcimage,srcimage,CV_BGR2RGB);
  176.     //Mat转QImage 像素   oldlabel放置原图
  177.     QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
  178.     disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
  179.     ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
  180.  
  181.     Mat retumage;
  182.     //双倍模糊
  183.     cv::bilateralFilter(srcimage,retumage,15,120,10,4);
  184.  
  185.     //Mat转QImage 像素   newlabel放置图像处理后图片
  186.     QImage disimage2 = QImage(retumage.data,retumage.cols,retumage.rows,retumage.cols*retumage.channels(),QImage::Format_RGB888);
  187.     disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
  188.     ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
  189. }
  190.  
  191. //腐蚀
  192. void Widget::on_pushButton_8_clicked()
  193. {
  194.     //读取原始图片
  195.     Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
  196.     //Mat转QImage 颜色
  197.     cvtColor(srcimage,srcimage,CV_BGR2RGB);
  198.     //Mat转QImage 像素   oldlabel放置原图
  199.     QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
  200.     disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
  201.     ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
  202.  
  203.     Mat retumage;
  204.     //腐蚀
  205.     Mat element = cv::getStructuringElement(MORPH_RECT,Size(5,5));
  206.     cv::erode(srcimage,retumage,element);
  207.  
  208.     //Mat转QImage 像素   newlabel放置图像处理后图片
  209.     QImage disimage2 = QImage(retumage.data,retumage.cols,retumage.rows,retumage.cols*retumage.channels(),QImage::Format_RGB888);
  210.     disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
  211.     ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
  212. }

主入口Qt窗口显示 

  1. #include "widget.h"
  2. #include <QApplication>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.     QApplication a(argc, argv);
  7.     Widget w;
  8.     w.show();
  9.     return a.exec();
  10. }

关于“怎么使用OpenCV+Qt实现图像处理操作工具”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恰卡网行业资讯频道,小编每天都会为大家更新不同的知识点。

本站部分文章来自网络或用户投稿,如无特殊说明或标注,均为本站原创发布。涉及资源下载的,本站旨在共享仅供大家学习与参考,如您想商用请获取官网版权,如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
开发者

怎么使用Python制作七夕表白

2022-8-3 21:24:53

开发者

C#实现学生成绩管理系统的代码如何写

2022-8-3 21:25:01

搜索