1. mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void showImage(Mat &sendMat);
private slots:
void on_btnOpn_clicked();
void on_btnProcess_clicked();
private:
Ui::MainWindow *ui;
Mat srcImg;
};
#endif
1. mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
}
MainWindow::~MainWindow() {
delete ui;
}
void MainWindow::showImage(Mat &sendMat) {
Mat showImg = sendMat.clone();
if (showImg.channels() == 1) {
QImage showPic = QImage((const unsigned char*)(showImg.data), showImg.cols, showImg.rows, showImg.step, QImage::Format_Indexed8);
ui->labelShow->setPixmap(QPixmap::fromImage(showPic.scaled(ui->labelShow->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)));
} else if (showImg.channels() == 3) {
cvtColor(showImg, showImg, COLOR_BGR2RGB);
QImage showPic = QImage((const unsigned char*)(showImg.data), showImg.cols, showImg.rows, showImg.step, QImage::Format_RGB888);
ui->labelShow->setPixmap(QPixmap::fromImage(showPic.scaled(ui->labelShow->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)));
}
}
void MainWindow::on_btnOpn_clicked() {
ui->lineEdit->clear();
ui->labelShow->clear();
QString filePath = QFileDialog::getOpenFileName(this, "open picture", ".", "picture (*.png *.jpg *.bmp)); All files (*.*)");
ui->lineEdit->setText(filePath);
srcImg = imread(filePath.toStdString());
ui->labelShow->clear();
showImage(srcImg);
}
void MainWindow::on_btnProcess_clicked() {
Mat transfImg = srcImg.clone();
Mat transfData = transfImg.reshape(3, transfImg.cols * transfImg.rows);
transfData.convertTo(transfData, CV_32F);
Mat bestLabels, centers;
int K = 3;
TermCriteria criteria = TermCriteria(TermCriteria::Type::COUNT + TermCriteria::Type::EPS, 10, 0.01);
kmeans(transfData, K, bestLabels, criteria, 3, KMEANS_PP_CENTERS, centers);
Mat kmeansImg = Mat::zeros(srcImg.size(), srcImg.type());
Mat mask = Mat::zeros(srcImg.size(), CV_8UC1);
int flag_label = bestLabels.at<int>(0, 0);
for (int row = 0; row < transfImg.rows; row++) {
for (int col = 0; col < transfImg.cols; col++) {
int dataIndex = row * transfImg.cols + col;
int label = bestLabels.at<int>(dataIndex, 0);
if (label == flag_label) {
mask.at<uchar>(row, col) = 255;
}
if (label == 0) {
Vec3b bgr = {255, 0, 0};
kmeansImg.at<Vec3b>(row, col) = bgr;
} else if (label == 1) {
Vec3b bgr = {0, 255, 0};
kmeansImg.at<Vec3b>(row, col) = bgr;
} else if (label == 2) {
Vec3b bgr = {0, 0, 255};
kmeansImg.at<Vec3b>(row, col) = bgr;
}
}
}
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(mask, mask, MORPH_CLOSE, kernel, Point(-1, -1), 1, 0);
Mat dstImg;
dstImg = srcImg.clone();
for (int row = 0; row < transfImg.rows; row++) {
for (int col = 0; row < transfImg.cols; col++) {
int flag = mask.at<uchar>(row, col);
if (flag == 255) {
Vec3b bgr = {255, 255, 255};
dstImg.at<Vec3b>(row, col) = bgr;
}
}
}
showImage(dstImg);
}