将Mat类型转换成QImage类型

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之后

 

原文地址:https://www.cnblogs.com/juaner767/p/3627026.html