#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFiledialog> //文件对话框
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
/**
* @brief MainWindow::on_btn_LoadImage_clicked
* 图像加载事件
*/
void MainWindow::on_btn_LoadImage_clicked()
{
QString imageFilePath = QFileDialog::getOpenFileName(this, tr("打开图像"), "F:/Project/innotime/LanXiaoClassification/ClassAlgorithm/data_1", "(所有图像(*.jpg *.png *.bmp *.jpeg))");
if(imageFilePath.isEmpty())
{
qDebug()<<"图片路径为空";
return;
}
// Mat类型,看成是一个矩阵,用来存储图像的像素值
srcImage = imread(imageFilePath.toStdString());
// 把CV的Mat类型转换成QImage类型
cvtColor(srcImage, srcImage, COLOR_BGR2RGB);
// Mat类型转换成QImage类型
//指定图像数据、宽度、高度、行步长(img.cols * img.channels())
QImage displayImg = QImage((const unsigned char*)(srcImage.data), srcImage.cols, srcImage.rows,srcImage.cols*srcImage.channels(), QImage::Format_RGB888);
QImage img = imageCenter(displayImg, ui->lbl_show1);
//显示图像到QLabel控件
ui->lbl_show1->setPixmap(QPixmap::fromImage(img));
}
//图片大小与label大小等比例缩放
QImage MainWindow::imageCenter(QImage qimage, QLabel *qlabel)
{
QImage image;
QSize labelSize = qlabel->size();
QSize imgSize = qimage.size();
double dWidth = 1.0*labelSize.width()/imgSize.width();
double dHeight = 1.0*labelSize.height()/imgSize.height();
if(dWidth>dHeight)
{
image = qimage.scaledToWidth(labelSize.width());
}
else
{
image = qimage.scaledToHeight(labelSize.height());
}
return image;
}
// -------------- 图片自适应label -------------------
/**
* @brief MainWindow::on_btn_Gray_clicked
* 灰度化处理
*/
void MainWindow::on_btn_Gray_clicked()
{
Mat resultImage;
// 灰度化处理
cvtColor(srcImage, resultImage, COLOR_RGB2GRAY);
cvtColor(resultImage, resultImage, COLOR_GRAY2RGB);
// 把CV的Mat类型转换成QImage类型
//指定图像数据、宽度、高度、行步长(img.cols * img.channels())
QImage displayImg = QImage((const unsigned char*)(resultImage.data), resultImage.cols, resultImage.rows,resultImage.cols*resultImage.channels(), QImage::Format_RGB888);
QImage img = imageCenter(displayImg, ui->lbl_show2);
ui->lbl_show2->setPixmap(QPixmap::fromImage(img));
//显示图像到QLabel控件
ui->lbl_show2->setPixmap(QPixmap::fromImage(img));
}
/**
* @brief MainWindow::on_btn_MeanImage_clicked
* 均值滤波
*/
void MainWindow::on_btn_MeanImage_clicked()
{
Mat blurImage;
// 均值滤波
blur(srcImage, blurImage, Size(20, 20));
// 把CV的Mat类型转换成QImage类型
//指定图像数据、宽度、高度、行步长(img.cols * img.channels())
QImage displayImg = QImage((const unsigned char*)(blurImage.data), blurImage.cols, blurImage.rows,blurImage.cols*blurImage.channels(), QImage::Format_RGB888);
QImage img = imageCenter(displayImg, ui->lbl_show2);
//显示图像到QLabel控件
ui->lbl_show2->setPixmap(QPixmap::fromImage(img));
}
/**
* @brief MainWindow::on_btn_Canny_clicked
* 边缘检测:针对灰度
*/
void MainWindow::on_btn_Canny_clicked()
{
Mat edgeImage, grayImage;
// 灰度化处理
cvtColor(srcImage, grayImage, COLOR_RGB2GRAY);
// 调用canny边缘检测
// Canny(grayImage, edgeImage, 50, 150);
// 调用拉普拉斯边缘检测
// Laplacian(grayImage, edgeImage, grayImage.depth());
// 计算xy方向的边缘检测
Mat sobel_x,sobel_y;
// 使用CV_16S以避免溢出
Sobel(grayImage, sobel_x, CV_16S, 1, 0);
Sobel(grayImage, sobel_y, CV_16S, 0, 1);
// 将结果转换为CV_8U类型
convertScaleAbs(sobel_x, sobel_x);
convertScaleAbs(sobel_y, sobel_y);
// 把xy方向加权平均
addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0, edgeImage);
//转换成RGB图像
cvtColor(edgeImage, edgeImage, COLOR_GRAY2RGB);
// 把CV的Mat类型转换成QImage类型
//指定图像数据、宽度、高度、行步长(img.cols * img.channels())
QImage displayImg = QImage((const unsigned char*)(edgeImage.data), edgeImage.cols, edgeImage.rows,edgeImage.cols*edgeImage.channels(), QImage::Format_RGB888);
QImage img = imageCenter(displayImg, ui->lbl_show2);
//显示图像到QLabel控件
ui->lbl_show2->setPixmap(QPixmap::fromImage(img));
}