日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Qt+OpenCV界面

發布時間:2025/5/22 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt+OpenCV界面 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

+------------------------------------------------------------------------------------------+

| ? 轉自:http://blog.csdn.net/yang_xian521/article/details/6968012 ? ?|
| ? 并在轉載完成后作一些修改。? ?? ?? ??? ?? ?? ??? ?? ?? ??? ?? ?? ??? ?? ?? ??? ?? ?? ??? ?? ? |
+-------------------------------------------------------------------------------------------+


==============================================================

一直對MFC對OpenCV的支持不好而耿耿于懷,了解了Qt對OpenCV支持很好,但網上這方面的資料很少。大部分的圖形交互的設計都是基于OpenCV2.0之前的數據結構lpImage進行的。最近得到了一本好書《OpenCV 2 Computer Vision Application Programming Cookbook》,下載的鏈接為http://ishare.iask.sina.com.cn/f/20485520.html?retcode=0,2011年5月出版,全書都是基于OpenCV2.2版本的實現,采用了新的數據結構。我這里強烈建議利用C++開發的朋友們不要再使用老版本的數據結構了,實在影響開發效率。至于大家最熟悉的參考書《learning OpenCV》和《OpenCV教程——基礎篇》這兩本廣為流傳的書,我的看法是已經遠遠不能滿足OpenCV新版本的學習了。真的希望這本新書的中文版盡快出爐。

參考這本書的利用Qt創建GUI,不過書中的辦法是在Qt Creator下實現的,我這里通過VS2008+Qt實現。下面結合一個例程介紹一下如何在Qt的GUI環境下開發OpenCV。

先新建工程Qt Project --> Qt Application,點擊finish完成工程的創建。然后在項目屬性里的連接器的附加依賴項里面添加opencv的lib文件。工程創建好之后,一個后綴名為.ui的文件就是關于界面設計的。首先創建兩個按鈕,拖拽兩個Push Buttons到Form中去,修改其屬性,一個名字為Open Image,一個為Process。右鍵按鈕選擇connect signal為其添加響應函數,選擇clicked()。對應的cpp文件多出了on_OpenImage_clicked函數,代碼如下:

[cpp]?view plaincopy
  • #include?"qttest1.h"??
  • ??
  • qttest1::qttest1(QWidget?*parent,?Qt::WFlags?flags)??
  • ????:?QMainWindow(parent,?flags)??
  • {??
  • ????ui.setupUi(this);??
  • }??
  • ??
  • qttest1::~qttest1()??
  • {??
  • ??
  • }??
  • ??
  • ??
  • void?qttest1::on_OpenImage_clicked()??
  • {??
  • ??
  • }??

  • 接下來要在對應的頭文件中添加顯示圖片的必要代碼,添加QFileDialog類的聲明,OpenCV必要的include頭文件包含,在類中聲明一個cv :: Mat成員變量。代碼如下:

    [cpp]?view plaincopy
  • #ifndef?QTTEST1_H??
  • #define?QTTEST1_H??
  • ??
  • #include?<QtGui/QMainWindow>??
  • #include?<QFileDialog>??
  • #include?"ui_qttest1.h"??
  • ??
  • #include?<opencv2/core/core.hpp>??
  • #include?<opencv2/highgui/highgui.hpp>??
  • ??
  • class?qttest1?:?public?QMainWindow??
  • {??
  • ????Q_OBJECT??
  • ??
  • public:??
  • ????qttest1(QWidget?*parent?=?0,?Qt::WFlags?flags?=?0);??
  • ????~qttest1();??
  • ??
  • private:??
  • ????Ui::qttest1Class?ui;??
  • ????cv::Mat?image;??//?cv圖片??
  • ??
  • private?slots:??
  • ????void?on_OpenImage_clicked();??
  • };??
  • ??
  • #endif?//?QTTEST1_H??


  • 接下來添加on_OpenImage_clicked的函數內容。代碼如下:

    [cpp]?view plaincopy
  • void?qttest1::on_OpenImage_clicked()??
  • {??
  • ????QString?fileName?=?QFileDialog::getOpenFileName(this,?tr("Open?Image"),?".",?tr("Image?Files?(*.png?*.jpg?*.jpeg?*.bmp)"));??
  • ????image?=?cv::imread(fileName.toAscii().data());??
  • ????cv::namedWindow("Original?Image");??
  • ????cv::imshow("Original?Image",?image);??
  • }??

  • 類似的辦法添加Process按鈕的相應代碼:

    [cpp]?view plaincopy
  • void?qttest1::on_Process_clicked()??
  • {??
  • ????cv::flip(image,?image,?1);??
  • ????cv::namedWindow("Output?Image");??
  • ????cv::imshow("Output?Image",?image);??
  • }??

  • 這樣就可以實現一個普通的按鈕響應。但我們的目的是將圖片顯示在對話框form中,這還需要進一步深入學習。與MFC中顯示圖片需要CvvImage類似,要想在Qt的Form中顯示圖片,圖片的格式也必須為QImage,需要將cv::Mat的BGR通道順序變換為RGBA,QImage的格式為Format_RGB32,調用cvtColor實現(這里例程里調用的為BGR2RGB,然后QImage的格式為Format_RGB888,但我試驗顯示結果是有問題的,故自己調整了一下)。(后經實驗,BGR2RGB,Format_RGB888這組參數對于webcam視頻是正確的,對于我當時的實驗照片是不正確的,格式的問題真是混亂!!!)實現代碼如下:

    [cpp]?view plaincopy
  • cv::cvtColor(image,?image,?CV_BGR2RGBA);??
  • QImage?img?=?QImage((const?unsigned?char*)(image.data),?image.cols,?image.rows,?QImage::Format_RGB32);??
  • QLabel?*label?=?new?QLabel(this);??
  • label->move(200,?50);??
  • label->setPixmap(QPixmap::fromImage(img));??
  • label->resize(label->pixmap()->size());??????
  • label->show();??

  • 注意打開圖片的路徑不要有中文,最后的顯示結果為


    相關代碼的下載地址為http://download.csdn.net/detail/yang_xian521/3793960

    ===============================================================================

    我的實踐與上文有兩處修改:

    1.?使用這個語句:image?=?cv::imread(fileName.toAscii().data()); 會導致非ASCII字符集的文件無法讀取

    改成了如下語句:image = cv::imread(q2s(fileName));

    其中:

    string q2s(const QString &s) ?
    { ?
    return string((const char *)s.toLocal8Bit()); ?
    }?

    2. 使用語句:cv::cvtColor(image,?image,?CV_BGR2RGBA); ?會導致圖片偏色(大致是藍色變成黃色)。

    將第三個參數改成了:CV_BGR2BGRA。


    歡迎大家參考與實踐,并且不要忘了去原作者的專欄捧場:http://blog.csdn.net/yang_xian521

    總結

    以上是生活随笔為你收集整理的Qt+OpenCV界面的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。