基礎學習筆記之opencv(7):ubuntu下opencv在Qt中的使用


 

本文的開發環境:ubuntu12.04LTS+QtCreator2.5.0+Qt4.8.2+opencv2.4.2

其中Qt的安裝方法參考:http://www.linuxidc.com/Linux/2011-02/32536.htm

QtCreator的安裝方法參考:http://www.linuxidc.com/Linux/2012-06/62607.htm

opencv的安裝方法參考:http://www.samontab.com/web/2012/06/installing-opencv-2-4-1-ubuntu-12-04-lts/

以上3個軟件均是指在ubuntu下的安裝,其中Qtopencv自己重新編譯了一遍源碼。


下面通過2個小例子來簡單介紹一下linuxopencv怎樣在Qt中進行編程的。

 

Example 1(用Qt Console Application開發):

QtCreator新建一個Qt Console Application的過程此處就省略掉。建立完后在main函數中輸入以下代碼:

#include <QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

int main(int argc, char *argv[])
{
//    QCoreApplication a(argc, argv);
    
    namedWindow( "src", WINDOW_AUTOSIZE );
    Mat src1 = imread( "lena.jpg" );
    while(1)
    {
        imshow( "src", src1 );
        char c =  waitKey(30);
        if( 27==c )
            return 0;
    }

//    return a.exec();
}

注意:

1.  因為這里使用的是Qt控制台程序,所以main函數的第一句 :

QCoreApplication a(argc, argv);

和最后一句:

return a.exec();

不能使用,否則運行時會報錯。

2.  另外需要注意一點的是,需要將opencv的頭文件和庫文件與Qt關聯起來,所以在雙擊QtCreator工程下到***.pro文件,在其后面添加下列代碼:

INCLUDEPATH += /usr/local/include \
                /usr/local/include/opencv \
                /usr/local/include/opencv2

LIBS += /usr/local/lib/libopencv_highgui.so \
        /usr/local/lib/libopencv_core.so    \
        /usr/local/lib/libopencv_imgproc.so

即此時對應的整個***.pro文件內容如下:

#-------------------------------------------------
#
# Project created by QtCreator 2012-07-09T22:01:34
#
#-------------------------------------------------

QT       += core

QT       -= gui

TARGET = test1
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

INCLUDEPATH += /usr/local/include \
                /usr/local/include/opencv \
                /usr/local/include/opencv2

LIBS += /usr/local/lib/libopencv_highgui.so \
        /usr/local/lib/libopencv_core.so    \
        /usr/local/lib/libopencv_imgproc.so

3.  第一個實驗需要提前把圖片,我這里用的是lena.jpg放入***-build-desktop-Qt_4_8_2_in_PATH__Qt-4_8_2__Release文件夾中,因為我的工程建立在桌面上,所以其默認的名字比較長。不放入這個文件夾或者放錯文件夾則運行時會出現錯誤的。

其運行結果如下:


 

Example 2Qt Gui Application開發):

  同樣,用QtCreator建立一個Qt Gui Application工程,頭文件和cpp文件采用默認的文件名。用Qt設計師設計一個界面如下所示,只有2個按鈕和一個label.

 

  

 

  建立相應的信號與槽關系后

mainwindow.h代碼如下:

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private slots:
    void on_openButton_clicked();

    void on_closeButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

 

mainwindow.cpp代碼如下:

 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui/QMainWindow>
#include <QFileDialog>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_openButton_clicked()
{
    //第3個參數表示查找文件時從哪個目錄開始,如果為"."的話,表示從該工程目錄開始查找,最后那個參數的過濾器的名字之間
    //要用空格,否則識別不出來
    QString img_name = QFileDialog::getOpenFileName( this, tr("Open Image"), ".",
                                                     tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));
    //toAscii()返回8位描述的string,為QByteArray,data()表示返回QByteArray的指針,QByteArray為字節指針
    Mat src = imread( img_name.toAscii().data() );
    cvtColor( src, src, CV_BGR2RGB );
    QImage img = QImage( (const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_RGB888 );
//    namedWindow( "Image_Show", WINDOW_AUTOSIZE );
//    imshow( "Image_Show", src );
    ui->label->setPixmap( QPixmap::fromImage(img) );
 //   ui->label->resize( ui->label->pixmap()->size() );

}

void MainWindow::on_closeButton_clicked()
{
    close();
}

 

當然main函數代碼沒變,如下:

#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    
    return a.exec();
}

 

pro文件內容添加與例1相類似的代碼,完成后代碼如下:

#-------------------------------------------------
#
# Project created by QtCreator 2012-07-09T21:57:26
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = test
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

INCLUDEPATH += /usr/local/include \
                /usr/local/include/opencv \
                /usr/local/include/opencv2

LIBS += /usr/local/lib/libopencv_highgui.so \
        /usr/local/lib/libopencv_core.so    \
        /usr/local/lib/libopencv_imgproc.so

 

實驗結果如下:

 

注意:在Qt中,其圖片的結構不是用Mat表示的,而是用QImage,且色彩空間順序為RGB,與opencv中的BGR順序略有不同。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM