Qt调用OpenCV打开图片

来源:互联网 发布:评论滚动效果php 编辑:程序博客网 时间:2024/05/09 08:30

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

文章链接: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?
  1. QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image File(*.png *.jpg *.jpeg *.bmp)"));  
  2. 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?
  1. #-------------------------------------------------  
  2. #  
  3. # Project created by QtCreator 2016-02-17T18:59:03  
  4. #  
  5. #-------------------------------------------------  
  6.   
  7. QT       += core gui  
  8.   
  9. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  
  10.   
  11. TARGET = openImage  
  12. TEMPLATE = app  
  13.   
  14.   
  15. SOURCES += main.cpp\  
  16.         mainwindow.cpp  
  17.   
  18. HEADERS  += mainwindow.h  
  19.   
  20. FORMS    += mainwindow.ui  
  21.   
  22. INCLUDEPATH += C:/Users/bingbuyu/Desktop/opencv2.4.8/include \  
  23.                C:/Users/bingbuyu/Desktop/opencv2.4.8/include/opencv \  
  24.                C:/Users/bingbuyu/Desktop/opencv2.4.8/include/opencv2  
  25.   
  26.   LIBS += -LC:/Users/bingbuyu/Desktop/opencv2.4.8/x64/mingw/lib -lopencv_core248.dll \  
  27.             -lopencv_highgui248.dll -lopencv_imgproc248.dll -lopencv_features2d248.dll \  
  28.             -lopencv_calib3d248.dll  
mainwindow.h如下:

[cpp] view plain copy print?
  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QMainWindow>  
  5. #include<opencv2/core/core.hpp>  
  6. #include<opencv2/highgui/highgui.hpp>  
  7. #include<opencv2/imgproc/imgproc.hpp>  
  8. #include<QString>  
  9. #include<QFileDialog>  
  10. #include<QLabel>  
  11. #include<QGraphicsScene>  
  12. #include<QGraphicsView>  
  13.   
  14. using namespace cv;  
  15.   
  16. namespace Ui {  
  17. class MainWindow;  
  18. }  
  19.   
  20. class MainWindow : public QMainWindow  
  21. {  
  22.     Q_OBJECT  
  23.   
  24. public:  
  25.     explicit MainWindow(QWidget *parent = 0);  
  26.     ~MainWindow();  
  27.   
  28. private slots:  
  29.     void on_pushButton_clicked();  
  30.   
  31.     void on_pushButton_2_clicked();  
  32.   
  33. private:  
  34.     Ui::MainWindow *ui;  
  35.     Mat image;  
  36.   
  37. };  
  38.   
  39. #endif // MAINWINDOW_H  
mainwindow.cpp如下

[cpp] view plain copy print?
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. MainWindow::MainWindow(QWidget *parent) :  
  4.     QMainWindow(parent),  
  5.     ui(new Ui::MainWindow)  
  6. {  
  7.     ui->setupUi(this);  
  8. }  
  9. MainWindow::~MainWindow()  
  10. {  
  11.     delete ui;  
  12. }  
  13. void MainWindow::on_pushButton_clicked()  
  14. {  
  15.     QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image File(*.png *.jpg *.jpeg *.bmp)"));  
  16.     image = cv::imread(fileName.toLatin1().data());  
  17.       
  18.     cv::cvtColor(image,image,CV_BGR2RGB);  
  19.     QImage img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);  
  20.     ui->label->setPixmap(QPixmap::fromImage(img));  
  21.      ui->label->resize(ui->label->pixmap()->size());  
  22.      ui->graphicsView->hide();  
  23.      //cv::namedWindow("Original Image");  
  24.      //cv::imshow("Original Image",image);  
  25. }  
  26. void MainWindow::on_pushButton_2_clicked()  
  27. {  
  28.     QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image File(*.png *.jpg *.jpeg *.bmp)"));  
  29.     image = cv::imread(fileName.toLatin1().data());  
  30.     cv::cvtColor(image,image,CV_BGR2RGB);  
  31.     QImage img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);  
  32.     ui->graphicsView->resize(img.width(), img.height());  
  33.     QGraphicsScene *scene = new QGraphicsScene;  
  34.     //scene->setSceneRect(0,0,img.width(),img.height());  
  35.     scene->addPixmap(QPixmap::fromImage(img));  
  36.     ui->graphicsView->setScene(scene);  
  37.     ui->graphicsView->adjustSize();  
  38.     ui->label->hide();  
  39.     ui->graphicsView->show();  
  40. }  


main.cpp保持默认不变。

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




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



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


原创粉丝点击