qt显示cv::mat图片

  • Post author:
  • Post category:其他


使用控件QLabel

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H


#include <QMainWindow>

#include <QFileDialog>

#include <QImage>

#include <QLabel>

#include <QTextCodec>

#include <QMessageBox>

#include <opencv2/opencv.hpp>

namespace Ui {

class MainWindow;

}


class MainWindow : public QMainWindow

{

Q_OBJECT


public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();


private:

Ui::MainWindow *ui;

cv::Mat image;


private slots:


void DisplayMat(cv::Mat image);

void on_pushButton_clicked();

};


#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);


}


MainWindow::~MainWindow()

{

delete ui;

}


void MainWindow::DisplayMat(cv::Mat image)

{

cv::Mat rgb;

QImage img;

if(image.channels() == 3)

{

cvtColor(image,rgb,CV_BGR2RGB);

img = QImage((const unsigned char*)(rgb.data),

rgb.cols,rgb.rows,rgb.cols*rgb.channels(),//rgb.cols*rgb.channels()可以替换为image.step

QImage::Format_RGB888);

}

else

{

img = QImage((const unsigned char*)(image.data),

image.cols,image.rows,rgb.cols*image.channels(),

QImage::Format_RGB888);

}

ui->labelimage->setPixmap(QPixmap::fromImage(img).scaled(ui->labelimage->size()));//setPixelmap(QPixmap::fromImage(img));

ui->labelimage->resize(ui->labelimage->pixmap()->size());//resize(ui->label->pixmap()->size());

}


void MainWindow::on_pushButton_clicked()

{

QString filename = QFileDialog::getOpenFileName(this,

tr("Open Image"),".",tr("Image File (*.jpg *.png *.bmp)"));

QTextCodec *code = QTextCodec::codecForName("gb18030");

std::string name = code->fromUnicode(filename).data();//filename.toAscii().data()

image = cv::imread(name);

if(!image.data)

{

QMessageBox msgBox;

msgBox.setText(tr("Image Data Is Null"));

msgBox.exec();

}

else {

DisplayMat(image);

}

}


main.cpp

#include "mainwindow.h"

#include <QApplication>


int main(int argc, char *argv[])

{

QApplication a(argc, argv);

MainWindow w;


w.show();


return a.exec();

}

显示结果如下:

注意事项:

这个过程中要注意几点:

第一:建立Qt QWidgets Application工程

第二:在ui界面上添加一个QLabel控件,并改名字为labelimage

在ui界面上添加一个Button按钮,点击右键,转到槽,选择第一个 clicked(),确定,就会生成一个按钮的响应函数即:

	on_pushButton_clicked()

第三:配置工程遇到的相关问题,比如, QT  += core gui widgets

添加LIBS

添加INCLUDEPATH

等等

————————————————————————————————————————————————————————————————————————

当然,不用OpenCV更方便可以显示出来

如下

在mainwindow.cpp中

#include "mainwindow.h"

#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

QImage myImage;

myImage.load("lena.jpg");

ui->labelimage->setPixmap(QPixmap::fromImage(myImage).scaled(ui->labelimage->size()));

}


MainWindow::~MainWindow()

{

delete ui;

}


且在ui界面中添加QLabel控件,并拖动设置其大小即可,mainwindow.h中添加#include<QImage>。其他不要变化!

显示结果如下。