OpenCV+Qt實現(xiàn)圖像處理操作
本文實例為大家分享了OpenCV+Qt實現(xiàn)圖像處理操作的具體代碼,供大家參考,具體內(nèi)容如下
一、目標
Qt界面實現(xiàn) 雪花屏 高斯模糊 中值濾波 毛玻璃 灰度化 XY方向模糊 雙邊模糊 腐蝕 [圖像處理操作]
要求左邊原圖,右邊效果圖
結(jié)果展示如下:[圖像處理實現(xiàn)有點多,就不一個一個地展示了,各別展示如下]
雪花屏

毛玻璃

灰度化處理

二、使用Qt界面
使用到Qt中的UI設(shè)計界面

設(shè)計好界面之后最好先保存
對每一個按鈕設(shè)計槽函數(shù)

三、圖像處理操作完整代碼
難點在于:Qt是QImage而OpenCV是Mat,需要Mat轉(zhuǎn)QImage才能在Qt界面中進行圖片的正常顯示

頭文件中導入opencv包
#ifndef WIDGET_H
#define WIDGET_H
#include<opencv2/opencv.hpp>
#include <QWidget>
using namespace cv;
?
QT_BEGIN_NAMESPACE
namespace Ui {class Widget;}
QT_END_NAMESPACE
?
class Widget : public QWidget
{
? ? Q_OBJECT
public:
// ?Widget(QWidget *parent = nullptr);
? ? explicit Widget(QWidget *parent = 0);
? ? ~Widget();
?
private slots:
? ? void on_pushButton_clicked();//雪花屏
? ? void on_pushButton_2_clicked();//高斯模糊
? ? void on_pushButton_3_clicked();//中值濾波
? ? void on_pushButton_4_clicked();//毛玻璃
? ? void on_pushButton_5_clicked();//灰度化
? ? void on_pushButton_6_clicked();//XY方向模糊
? ? void on_pushButton_7_clicked();//雙邊模糊
? ? void on_pushButton_8_clicked();//腐蝕
private:
? ? Ui::Widget *ui;
? ? Mat srcimage;//原圖
};
?
#endif // WIDGET_H源文件中實現(xiàn)圖像處理方法
#include "widget.h"
#include "ui_widget.h"
?
Widget::Widget(QWidget *parent) :
? ? QWidget(parent),
? ? ui(new Ui::Widget)
{
? ? ui->setupUi(this);
}
?
Widget::~Widget()
{
? ? delete ui;
}
?
//雪花屏
void Widget::on_pushButton_clicked()
{
? ? //讀取原始圖片
? ? Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
? ? //Mat轉(zhuǎn)QImage 顏色
? ? cvtColor(srcimage,srcimage,CV_BGR2RGB);
? ? //Mat轉(zhuǎn)QImage 像素 ? oldlabel放置原圖
? ? QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
? ? disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
? ? ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
?
? ? //像素二維矩陣函數(shù)
? ? int rows = srcimage.rows;
? ? //像素二維矩陣列數(shù)
? ? int cols = srcimage.cols * srcimage.channels();
? ? for(int i=0;i<rows;i++)
? ? {
? ? ? ? uchar * data = srcimage.ptr<uchar>(i);
? ? ? ? for(int j=0;j<cols;j++)
? ? ? ? {
? ? ? ? ? ? //雪花屏特效
? ? ? ? ? ? int q = rand()%cols;
? ? ? ? ? ? data[q]=155;//某些通道隨機改成155
? ? ? ? }
? ? }
? ? //Mat轉(zhuǎn)QImage 像素 ? newlabel放置圖像處理后圖片
? ? QImage disimage2 = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
? ? disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
? ? ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
}
?
//高斯模糊
void Widget::on_pushButton_2_clicked()
{
? ? //讀取原始圖片
? ? Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
? ? //Mat轉(zhuǎn)QImage 顏色
? ? cvtColor(srcimage,srcimage,CV_BGR2RGB);
? ? //Mat轉(zhuǎn)QImage 像素 ? oldlabel放置原圖
? ? QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
?
? ? Mat retimage;
? ? //高斯模糊
? ? GaussianBlur(srcimage,retimage,Size(5,5),0,0);
?
? ? //Mat轉(zhuǎn)QImage 像素 ? newlabel放置圖像處理后圖片
? ? QImage disimage2 = QImage(retimage.data,retimage.cols,retimage.rows,retimage.cols*retimage.channels(),QImage::Format_RGB888);
? ? disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
? ? ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
}
?
//中值濾波
void Widget::on_pushButton_3_clicked()
{
? ? //讀取原始圖片
? ? Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
? ? //Mat轉(zhuǎn)QImage 顏色
? ? cvtColor(srcimage,srcimage,CV_BGR2RGB);
? ? //Mat轉(zhuǎn)QImage 像素 ? oldlabel放置原圖
? ? QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
? ? disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
? ? ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
?
? ? Mat retumage;
? ? //中值濾波
? ? medianBlur(srcimage,retumage,5);
?
? ? //Mat轉(zhuǎn)QImage 像素 ? newlabel放置圖像處理后圖片
? ? QImage disimage2 = QImage(retumage.data,retumage.cols,retumage.rows,retumage.cols*retumage.channels(),QImage::Format_RGB888);
? ? disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
? ? ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
}
?
//毛玻璃
void Widget::on_pushButton_4_clicked()
{
? ? //讀取原始圖片
? ? Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
? ? //Mat轉(zhuǎn)QImage 顏色
? ? cvtColor(srcimage,srcimage,CV_BGR2RGB);
? ? //Mat轉(zhuǎn)QImage 像素 ? oldlabel放置原圖
? ? QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
? ? disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
? ? ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
?
? ? //毛玻璃
? ? RNG rng;
? ? int random;
? ? int num = 5;
? ? for(int i=0;i<srcimage.rows -num;i++)
? ? {
? ? ? ? for(int j=0;j<srcimage.cols -num;j++)
? ? ? ? {
? ? ? ? ? ? //通過rng返回0-15隨機數(shù)
? ? ? ? ? ? random = rng.uniform(0,num);
? ? ? ? ? ? srcimage.at<Vec3b>(i,j)[0] = srcimage.at<Vec3b>(i+random,j+random)[0];
? ? ? ? ? ? srcimage.at<Vec3b>(i,j)[1] = srcimage.at<Vec3b>(i+random,j+random)[1];
? ? ? ? ? ? srcimage.at<Vec3b>(i,j)[2] = srcimage.at<Vec3b>(i+random,j+random)[2];
? ? ? ? }
? ? }
?
? ? //Mat轉(zhuǎn)QImage 像素 ? newlabel放置圖像處理后圖片
? ? QImage disimage2 = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
? ? disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
? ? ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
}
?
//灰度化
void Widget::on_pushButton_5_clicked()
{
? ? //讀取原始圖片
? ? Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
? ? //Mat轉(zhuǎn)QImage 顏色
? ? cvtColor(srcimage,srcimage,CV_BGR2RGB);
? ? //Mat轉(zhuǎn)QImage 像素 ? oldlabel放置原圖
? ? QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
? ? disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
? ? ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
?
? ? Mat retumage;
? ? //灰度處理 灰度是單通道8位 QImage是24位三通道
? ? cvtColor(srcimage,retumage,CV_BGR2GRAY);
? ? cvtColor(retumage,retumage,CV_GRAY2BGR);
?
? ? //Mat轉(zhuǎn)QImage 像素 ? newlabel放置圖像處理后圖片
? ? QImage disimage2 = QImage(retumage.data,retumage.cols,retumage.rows,retumage.cols*retumage.channels(),QImage::Format_RGB888);
? ? disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
? ? ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
}
?
//XY方向模糊
void Widget::on_pushButton_6_clicked()
{
? ? //讀取原始圖片
? ? Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
? ? //Mat轉(zhuǎn)QImage 顏色
? ? cvtColor(srcimage,srcimage,CV_BGR2RGB);
? ? //Mat轉(zhuǎn)QImage 像素 ? oldlabel放置原圖
? ? QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
? ? disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
? ? ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
?
? ? Mat retumage;
? ? //xy軸模糊
? ? blur(srcimage,retumage,Size(10,10));
?
? ? //Mat轉(zhuǎn)QImage 像素 ? newlabel放置圖像處理后圖片
? ? QImage disimage2 = QImage(retumage.data,retumage.cols,retumage.rows,retumage.cols*retumage.channels(),QImage::Format_RGB888);
? ? disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
? ? ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
}
?
//雙邊模糊
void Widget::on_pushButton_7_clicked()
{
? ? //讀取原始圖片
? ? Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
? ? //Mat轉(zhuǎn)QImage 顏色
? ? cvtColor(srcimage,srcimage,CV_BGR2RGB);
? ? //Mat轉(zhuǎn)QImage 像素 ? oldlabel放置原圖
? ? QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
? ? disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
? ? ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
?
? ? Mat retumage;
? ? //雙倍模糊
? ? cv::bilateralFilter(srcimage,retumage,15,120,10,4);
?
? ? //Mat轉(zhuǎn)QImage 像素 ? newlabel放置圖像處理后圖片
? ? QImage disimage2 = QImage(retumage.data,retumage.cols,retumage.rows,retumage.cols*retumage.channels(),QImage::Format_RGB888);
? ? disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
? ? ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
}
?
//腐蝕
void Widget::on_pushButton_8_clicked()
{
? ? //讀取原始圖片
? ? Mat srcimage = imread("D:/000imageopencv/efls111.jpg");
? ? //Mat轉(zhuǎn)QImage 顏色
? ? cvtColor(srcimage,srcimage,CV_BGR2RGB);
? ? //Mat轉(zhuǎn)QImage 像素 ? oldlabel放置原圖
? ? QImage disimage = QImage(srcimage.data,srcimage.cols,srcimage.rows,srcimage.cols*srcimage.channels(),QImage::Format_RGB888);
? ? disimage = disimage.scaled(ui->oldlabel->width(),ui->oldlabel->height());
? ? ui->oldlabel->setPixmap(QPixmap::fromImage(disimage));
?
? ? Mat retumage;
? ? //腐蝕
? ? Mat element = cv::getStructuringElement(MORPH_RECT,Size(5,5));
? ? cv::erode(srcimage,retumage,element);
?
? ? //Mat轉(zhuǎn)QImage 像素 ? newlabel放置圖像處理后圖片
? ? QImage disimage2 = QImage(retumage.data,retumage.cols,retumage.rows,retumage.cols*retumage.channels(),QImage::Format_RGB888);
? ? disimage2 = disimage2.scaled(ui->newlabel->width(),ui->newlabel->height());
? ? ui->newlabel->setPixmap(QPixmap::fromImage(disimage2));
}主入口Qt窗口顯示
#include "widget.h"
#include <QApplication>
?
int main(int argc, char *argv[])
{
? ? QApplication a(argc, argv);
? ? Widget w;
? ? w.show();
? ? return a.exec();
}以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解析wprintf 中使用%I64d格式化輸出LONGLONG的詳細介紹
本篇文章是對wprintf 中使用%I64d格式化輸出LONGLONG進行了詳細的分析介紹,需要的朋友參考下2013-05-05
關(guān)于C++中的static關(guān)鍵字的總結(jié)
C++的static有兩種用法:面向過程程序設(shè)計中的static和面向?qū)ο蟪绦蛟O(shè)計中的static。前者應(yīng)用于普通變量和函數(shù),不涉及類;后者主要說明static在類中的作用2013-09-09
C++11 lambda表達式在回調(diào)函數(shù)中的使用方式
這篇文章主要介紹了C++11 lambda表達式在回調(diào)函數(shù)中的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄
在使用OpenCV的cv::VideoCapture讀取視頻文件時,可能會遇到無法讀取特定格式,如MP4的視頻文件的問題,本文介紹解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄,感興趣的朋友跟隨小編一起看看吧2024-09-09
排列和組合算法的實現(xiàn)方法_C語言經(jīng)典案例
下面小編就為大家?guī)硪黄帕泻徒M合算法的實現(xiàn)方法_C語言經(jīng)典案例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
C++實現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹)
這篇文章主要介紹了C++實現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

