本文由@星沉阁冰不语出品,转载请注明作者和出处。
文章链接: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方式显示的图片。
最近开通了微信公众号,感兴趣的同学可以扫码在微信上交流。