zoukankan      html  css  js  c++  java
  • 将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之后

     

  • 相关阅读:
    OpenGL Pixel Linked-List
    Unity multi_compile
    Bindless Textures
    chmod递归设置文件属性
    push submodule
    NodeJS Debugger
    重载new操作符
    OpenGL瓶颈
    NGUI架构和Draw Call合并原理
    字符串哈希函数(String Hash Functions)
  • 原文地址:https://www.cnblogs.com/juaner767/p/3627026.html
Copyright © 2011-2022 走看看