Qt调用OpenCV打开图片

xiaoxiao2021-02-28  122

本文由@星沉阁冰不语出品,转载请注明作者和出处。

文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/50688378

微博:http://weibo.com/xingchenbing 

千辛万苦,最终还是在一位前辈的帮助下把环境给配置好了。对于Qt中OpenCV环境的配置,记录以下几点:

1.opencv一定要是自己用CMake编译的mingw版本!就因为老是编译不成功,导致费了一周也没配置好。换系统、换不同版本的opencv,重装Qt根本没用。

2.qt程序运行的时候要把opencv的相应*.dll文件拷贝到对应的Debug文件夹中去,即和*.pro、*.cpp等放在一起。

还有就是如果不懂不要一味的只是百度、Google,找个有经验的前辈指点一二有时可以省去几天的功夫。

配置好之后就开始编程吧。最简单的就是打开并显示一张图片了。

在文件夹中打开一张图片用到的是下面来这两行程序:

[cpp] view plain copy print ? QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image File(*.png *.jpg *.jpeg *.bmp)"));  image = cv::imread(fileName.toLatin1().data());   QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image File(*.png *.jpg *.jpeg *.bmp)")); image = cv::imread(fileName.toLatin1().data());

显示图片时,如果用imshow当然简单,但是如果要用Qt界面来显示的话就得有一番计较了。

首先得把opencv的Mat格式图片转换成Qt的QImage格式。由于opencv的图片格式红绿蓝三通单的顺序是BGR,还要先把BGR转换成RGB。

显示的时候可以用QLabel也可以用Graphics View。两种方式显示图片的方式见最终程序。

程序如下:

openImage.pro文件

[cpp] view plain copy print ? #-------------------------------------------------  #  # Project created by QtCreator 2016-02-17T18:59:03  #  #-------------------------------------------------    QT       += core gui    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets    TARGET = openImage  TEMPLATE = app      SOURCES += main.cpp\          mainwindow.cpp    HEADERS  += mainwindow.h    FORMS    += mainwindow.ui    INCLUDEPATH += C:/Users/bingbuyu/Desktop/opencv2.4.8/include \                 C:/Users/bingbuyu/Desktop/opencv2.4.8/include/opencv \                 C:/Users/bingbuyu/Desktop/opencv2.4.8/include/opencv2      LIBS += -LC:/Users/bingbuyu/Desktop/opencv2.4.8/x64/mingw/lib -lopencv_core248.dll \              -lopencv_highgui248.dll -lopencv_imgproc248.dll -lopencv_features2d248.dll \              -lopencv_calib3d248.dll   #------------------------------------------------- # # Project created by QtCreator 2016-02-17T18:59:03 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = openImage TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui INCLUDEPATH += C:/Users/bingbuyu/Desktop/opencv2.4.8/include \ C:/Users/bingbuyu/Desktop/opencv2.4.8/include/opencv \ C:/Users/bingbuyu/Desktop/opencv2.4.8/include/opencv2 LIBS += -LC:/Users/bingbuyu/Desktop/opencv2.4.8/x64/mingw/lib -lopencv_core248.dll \ -lopencv_highgui248.dll -lopencv_imgproc248.dll -lopencv_features2d248.dll \ -lopencv_calib3d248.dll mainwindow.h如下:

[cpp] view plain copy print ? #ifndef MAINWINDOW_H  #define MAINWINDOW_H    #include <QMainWindow>  #include<opencv2/core/core.hpp>  #include<opencv2/highgui/highgui.hpp>  #include<opencv2/imgproc/imgproc.hpp>  #include<QString>  #include<QFileDialog>  #include<QLabel>  #include<QGraphicsScene>  #include<QGraphicsView>    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 on_pushButton_2_clicked();    private:      Ui::MainWindow *ui;      Mat image;    };    #endif // MAINWINDOW_H   #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<QString> #include<QFileDialog> #include<QLabel> #include<QGraphicsScene> #include<QGraphicsView> 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 on_pushButton_2_clicked(); private: Ui::MainWindow *ui; Mat image; }; #endif // MAINWINDOW_H mainwindow.cpp如下

[cpp] view plain copy print ? #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::on_pushButton_clicked()  {      QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image File(*.png *.jpg *.jpeg *.bmp)"));      image = cv::imread(fileName.toLatin1().data());            cv::cvtColor(image,image,CV_BGR2RGB);      QImage img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);      ui->label->setPixmap(QPixmap::fromImage(img));       ui->label->resize(ui->label->pixmap()->size());       ui->graphicsView->hide();       //cv::namedWindow("Original Image");       //cv::imshow("Original Image",image);  }  void MainWindow::on_pushButton_2_clicked()  {      QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image File(*.png *.jpg *.jpeg *.bmp)"));      image = cv::imread(fileName.toLatin1().data());      cv::cvtColor(image,image,CV_BGR2RGB);      QImage img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);      ui->graphicsView->resize(img.width(), img.height());      QGraphicsScene *scene = new QGraphicsScene;      //scene->setSceneRect(0,0,img.width(),img.height());      scene->addPixmap(QPixmap::fromImage(img));      ui->graphicsView->setScene(scene);      ui->graphicsView->adjustSize();      ui->label->hide();      ui->graphicsView->show();  }   #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::on_pushButton_clicked() { QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image File(*.png *.jpg *.jpeg *.bmp)")); image = cv::imread(fileName.toLatin1().data()); cv::cvtColor(image,image,CV_BGR2RGB); QImage img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888); ui->label->setPixmap(QPixmap::fromImage(img)); ui->label->resize(ui->label->pixmap()->size()); ui->graphicsView->hide(); //cv::namedWindow("Original Image"); //cv::imshow("Original Image",image); } void MainWindow::on_pushButton_2_clicked() { QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image File(*.png *.jpg *.jpeg *.bmp)")); image = cv::imread(fileName.toLatin1().data()); cv::cvtColor(image,image,CV_BGR2RGB); QImage img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888); ui->graphicsView->resize(img.width(), img.height()); QGraphicsScene *scene = new QGraphicsScene; //scene->setSceneRect(0,0,img.width(),img.height()); scene->addPixmap(QPixmap::fromImage(img)); ui->graphicsView->setScene(scene); ui->graphicsView->adjustSize(); ui->label->hide(); ui->graphicsView->show(); }

main.cpp保持默认不变。

运行。程序异常终止。把用到的opencv的dll文件拷贝到Debug文件夹下,结果如下:

第二第三张分别为QLabel和Graphics View方式显示的图片。

最近开通了微信公众号,感兴趣的同学可以扫码在微信上交流。

转载请注明原文地址: https://www.6miu.com/read-48590.html

最新回复(0)