Qt对话框显示opencv读取的图像

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cfqcfqcfqcfqcfq/article/details/52863567

  opencv和Qt结合使用,既可以发挥opencv强大的图像处理能力,又能够发挥Qt优势使其有一个良好的交互界面。用Qt对话框显示图片的核心,就是解决如何两种不同的图像数据类型Mat和QImage之间的转化。以及Qt图像显示部件的选取。查阅的参考文献多使用QLabel来显示图片。但存在图片显示不居中等问题。 Qt提供了专业的Graphic View框架用来显示和交互2D图形图像。功能十分强大


代码如下:

#include "dialog.h"
#include "ui_dialog.h"
#include <QFileDialog>
#include <opencv2/opencv.hpp>
#include <QDebug>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);


    //connect
    connect(ui->openButton,SIGNAL(clicked(bool)),this,SLOT(SlotopenFile()));
}

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


void Dialog::SlotopenFile()
{
    fileName = QFileDialog::getOpenFileName(this, tr("Open Images"),
                                            "E:/test/",
                                            tr("Images (*.png);;\
                                                Images (*.jpg);;\
                                                Images (*.tif)"));

    cv::Mat src=cv::imread(fileName.toStdString());
    double fx=(double)(ui->graphicsView->width()-10)/src.cols;
    double fy=(double)(ui->graphicsView->height()-10)/src.rows;
    if(fx<fy)
        fy=fx;
    if(fx>fy)
        fx=fy;
    cv::resize(src,src,cv::Size(),fx,fy);

    srcImage=Mat2QImage(src);
    showImage(srcImage);
}

QImage Dialog::Mat2QImage(cv::Mat &image)
{
    QImage img;

    if(image.channels()==3)
    {
        //cvt Mat BGR 2 QImage RGB
        cv::cvtColor(image,image,CV_BGR2RGB);
        img =QImage((const unsigned char*)(image.data),
                    image.cols,image.rows,
                    image.cols*image.channels(),
                    QImage::Format_RGB888);
    }
    else
    {
        img =QImage((const unsigned char*)(image.data),
                    image.cols,image.rows,
                    image.cols*image.channels(),
                    QImage::Format_RGB888);
    }

    return img;
}

void Dialog::showImage(QImage image)
{
    QGraphicsScene *scene = new QGraphicsScene;
    scene->addPixmap(QPixmap::fromImage(image));
    ui->graphicsView->setScene(scene);
    //ui->graphicsView->resize(image.width() + 5, image.height() + 5);
    ui->graphicsView->show();
}

结果:

 

参考文献:

  1、Mat->QImage
  2、点击打开链接

   3 、Graphics View Framework

展开阅读全文

没有更多推荐了,返回首页