ui
头文件
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2/core/core.hpp> using namespace cv; namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog(); void Mat2QImage(Mat image); // void salt(Mat &image, int n); // void colorReduce(Mat image,int div); private slots: void on_pushButton_clicked(); private: Ui::Dialog *ui; Mat img; QImage qimg; }; #endif // DIALOG_H
源文件
#include "dialog.h" #include "ui_dialog.h" #include <QFileDialog> Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); } Dialog::~Dialog() { delete ui; } void Dialog::on_pushButton_clicked() { QString filename= QFileDialog::getOpenFileName(this,tr("choose image"),QDir::currentPath());//父窗口 窗口名 路径 img=imread(filename.toAscii().data()); Mat2QImage(img); } void Dialog::Mat2QImage(Mat image) { //图片的显示主要问题还是在于QImage与Mat格式的不同,其中QImage是RGB排列,而Mat 是 BGR, //同时两者格式包含的内容页不同,因此需要经过转换才能够显示。 Mat rgb; QImage img; //salt(image ,100000); // colorReduce(image,64); if(image.channels()==3) { //cvt Mat BGR 2 QImage RGB cvtColor(image,rgb,CV_BGR2RGB); img =QImage((const unsigned char*)(rgb.data), rgb.cols,rgb.rows, rgb.cols*rgb.channels(), QImage::Format_RGB888); } else { img =QImage((const unsigned char*)(image.data), image.cols,image.rows, image.cols*image.channels(), QImage::Format_RGB888); } //ui->label->setPixmap(QPixmap::fromImage(img)); //QImage转换为QPixmap //ui->label->resize(ui->label->pixmap()->size()); QImage imgScaled ; imgScaled = img.scaled(ui->label->size(),Qt::KeepAspectRatio);//默认保持原图的宽高比 以label大小为大小 ui->label->setPixmap(QPixmap::fromImage(imgScaled)); } void Dialog::salt(cv::Mat &image, int n) { int i,j; for (int k=0; k<n; k++) { i= qrand()%image.cols; j= qrand()%image.rows; if (image.channels() == 1) { // gray-level image image.at<uchar>(j,i)= 255; } else if (image.channels() == 3) { // color image /* 注意 Mat::at 函数是个模板函数, 需要指明参数类型, 因为这张图是具有红蓝绿三通道的图, 所以它的参数类型可以传递一个 Vec3b, 这是一个存放 3 个 uchar 数据的 Vec(向量). 这里 提供了索引重载, [2]表示的是返回第三个通道, 在这里是 Red 通道, 第一个通道(Blue)用[0]返回 */ image.at<cv::Vec3b>(j,i)[0]= 255;//白点; image.at<cv::Vec3b>(j,i)[1]= 255; image.at<cv::Vec3b>(j,i)[2]= 255; } } } void Dialog::colorReduce(Mat image, int div) { int nl= image.rows; // number of lines int nc= image.cols * image.channels(); // total number of elements per line for (int j=0; j<nl; j++) { uchar* data= image.ptr<uchar>(j);//获取每一行开始处的指针 for (int i=0; i<nc; i++) { // process each pixel --------------------- data[i]= data[i]/div*div+div/2; // end of pixel processing ---------------- } // end of line } }
colorReduce之后