QT读取图像 显示

这里写图片描述

1.在ui界面放置一个button,对象名称为pushButton;放置一个label,名称为imagelabel
2.头文件 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QImage>
#include <QFileDialog>
#include <QTimer>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    void displayMat(Mat image);
private:
    Ui::MainWindow *ui;
    cv::Mat image;
};

#endif // MAINWINDOW_H

源文件 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),
                                    ".",tr("Image Files (*.png *.jpg *.bmp)"));
        qDebug()<<"filenames:"<<fileName;
        image = cv::imread(fileName.toLatin1().data());
    //    cv::namedWindow((fileName.toAscii().data()),CV_WINDOW_AUTOSIZE);    //display use a new window
    //    cv::imshow((fileName.toAscii().data()), image);
        displayMat(image);
}
void MainWindow::displayMat(Mat image)
{
    Mat rgb;
    QImage img;
    QImage imgScaled;
    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);
    }
    imgScaled=img.scaled(ui->imagelabel->size(),Qt::KeepAspectRatio);
   // ui->imagelabel->setPixmap(QPixmap::fromImage(img));
     ui->imagelabel->setPixmap(QPixmap::fromImage(imgScaled));
    ui->imagelabel->resize(ui->imagelabel->pixmap()->size());
}

参考于[http://www.cnblogs.com/emouse/archive/2013/03/29/2988717.html]

**

为了以后使用方便,进一步进行封装处理:

**
头文件 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QImage>
#include <QFileDialog>
#include <QTimer>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    void display(QImage image);
    QImage Mat2QImage(const cv::Mat &mat);
private:
    Ui::MainWindow *ui;
    cv::Mat image;
    QImage qimg;
    cv::Mat rgb;
};

#endif // MAINWINDOW_H

源文件 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),
                                    ".",tr("Image Files (*.png *.jpg *.bmp)"));
        qDebug()<<"filenames:"<<fileName;
        image = cv::imread(fileName.toLatin1().data());
    //    cv::namedWindow((fileName.toAscii().data()),CV_WINDOW_AUTOSIZE);    //display use a new window
    //    cv::imshow((fileName.toAscii().data()), image);
        qimg=MainWindow::Mat2QImage(image);
        display(qimg);
}

QImage MainWindow::Mat2QImage(const cv::Mat &mat)
{
    QImage img;
    if(mat.channels()==3)
    {
        cvtColor(mat,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*)(mat.data),
                    mat.cols,mat.rows,
                    mat.cols*mat.channels(),
                    QImage::Format_RGB888);
    }
    return img;
}

void MainWindow::display(const QImage img)
{

    QImage imgScaled;
    imgScaled=img.scaled(ui->imagelabel->size(),Qt::KeepAspectRatio);
   // ui->imagelabel->setPixmap(QPixmap::fromImage(img));
      ui->imagelabel->setPixmap(QPixmap::fromImage(imgScaled));
   // ui->imagelabel->resize(ui->imagelabel->pixmap()->size());
}

猜你喜欢

转载自blog.csdn.net/qq_34929774/article/details/78889756