QT讀取影象 顯示
阿新 • • 發佈:2018-11-09
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());
}