zoukankan      html  css  js  c++  java
  • 利用qt打开一张图片并转成灰度矩阵

    首先是mat类,这个类的主要作用是构造一个容器,并将对应像素的灰度值放在容器内

    #ifndef MAT_H
    #define MAT_H
    
    #include <vector>
    #include <qimage.h>
    #include <qstring.h>
    class mat{
    public:
        mat(){}
        mat(QImage &img):width(img.width()),
        height(img.height()),_img(img){}
        //构造函数,通过qt QImage类图片来完成mat类的初始化
        void filldata();
        //将QImage类图片内的数据转成灰度数据并附给mat类成员
        QString print();
        //将像素值转成Qstring对象,用于输出到label上
    private:
        int width;
        int height;
        QImage _img;
        std::vector<int> data;
    };
    
    
    
    void mat::filldata()
    {
        for(int i=0;i<width;i++)
        { for(int j=0;j<height;j++)
            {
              data.push_back(qGray(_img.pixel(i,j)));
              //最初在写这里的时候使用了Qrgb value =_img.pixel(i,j)
              //data.push_back(qGray(value)),但是这样导致了所有灰度值均为0;
              //目前还不知道原因
            }
        }
    }
    
    QString mat::print()
    {
        mat::filldata();
        QString sdata;
        for(int i=0;i<width;i++)
        {
            for(int j=0;j<height;j++)
            {
              sdata =sdata+"  "+QString::number(data.at(i*height+j),10);
              //i*height+j,将height和width转为一列
            }
            sdata =sdata+'
    ';
        }
    
        return sdata;
    }
    #endif

    上面的mat类简单的实现了将qt图片转成类似matlab数据的功能。后续计划重载各种运算符,让这个mat类能实现更多矩阵的运算。

    这是qmainwindow,也就是主界面,用于交互

    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "qstring.h"
    #include "qfiledialog.h"
    #include "qmessagebox.h"
    #include "mat.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        QString filename;
        filename = QFileDialog::getOpenFileName(this,tr("choose image"),"",tr(""));
        if(filename.isEmpty())
        {
            return;
        }
        else
        {
            QImage* img = new QImage;
            if(!(img->load(filename)))
            {
                QMessageBox::information(this,tr("open image failed"),
                                         tr("open image failed"));
                delete img;
                return;
            }
    '''
            ui->label->setScaledContents(true);
            //这句可以让图片自动适应label的尺寸
    '''   
            ui->label->setPixmap(QPixmap::fromImage(*img));
    
            mat matrix(*img);
            ui->label->setText(matrix.print());
        }
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    2019年6月4号总结
    2019年5月21号总结
    2019年5月8号总结
    2019年5月6号总结
    2019年5月5号总结
    2019年4月18号总结
    java错误笔记之判断字符知否为空出错
    错误笔记:静态方法不能实例化,直接用类名.方法名调用
    Thymeleaf中"th:each""th:if"的用法解析
    @ResponseBody 表示返回的是josn
  • 原文地址:https://www.cnblogs.com/ironstark/p/4892645.html
Copyright © 2011-2022 走看看