1. 程式人生 > >QT讀取影象 顯示

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());
}