OpenCV实践之路——Qt中调用OpenCV打开图片

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

文章链接: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,找个有经验的前辈指点一二有时可以省去几天的功夫。


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

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

    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文件

#-------------------------------------------------
#
# 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如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include
#include
#include
#include
#include
#include
#include
#include

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如下

#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文件夹下,结果如下:

OpenCV实践之路——Qt中调用OpenCV打开图片_第1张图片

OpenCV实践之路——Qt中调用OpenCV打开图片_第2张图片

OpenCV实践之路——Qt中调用OpenCV打开图片_第3张图片

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



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


你可能感兴趣的:(C++,OpenCV,Qt,OpenCV实践之路)