Opencv&Qt之翻轉圖像

修正:轉換出來的圖片顏色不對勁,必須處理:編輯器

    /*圖片的顯示主要問題仍是在於QImage與Mat格式的不一樣,
     * 其中QImage是RGB排列,而Mat  BGR,同時二者
     * 格式包含的內容頁不一樣,所以須要通過轉換纔可以顯示。
    */

 

一、創建一個GUI工程,基類選擇QMainWindows,類名不變,選中"界面建立"函數

二、打開UI編輯器,拖動一個label,兩個PushButton到界面上。ui

三、添加opencv支持,在.pro文件的最下方:this

INCLUDEPATH += E:/software/opencv-3.4.2/build/install/include/opencv \
 E:/software/opencv-3.4.2/build/install/include/opencv2 \
 E:/software/opencv-3.4.2/build/install/include

 LIBS += -L E:/software/opencv-3.4.2/build/install/x86/mingw/bin/libopencv_*.dll

四、mainWindow.h中添加必要的頭文件以及定義一個Mat對象編碼

#include <cv.h>
#include <highgui.h>
#include <QFileDialog>   //文件操做支持
#include <opencv2/opencv.hpp>  //image

using namespace cv;






private:
      Mat image ;

五、mainWindow.cpp中,spa

對於構造函數,添加:code

ui->label->resize(300, 300);  //重設畫布大小
    ui->reversePushButton->setEnabled(false);  //沒有打開圖像時, 翻轉圖像按鈕設置爲不能點擊

 

兩個按鈕的槽函數orm

void MainWindow::on_openPushButton_clicked()
{
    //打開圖像,獲取圖像名稱
    QString filename = QFileDialog::getOpenFileName(this,
                                                        tr("open image"),
                                                        ".",
                                                        tr("Image file(*.png *.jpg *.bmp)"));
    /*
     * QString QFileDialog::getOpenFileName (
          QWidget * parent = 0,
          const QString & caption = QString(),
          const QString & dir = QString(),
          const QString & filter = QString(),
          QString * selectedFilter = 0,
          Options options = 0 )
    * 一、this:指定父組件, 當前爲MainWindow  QWidget * parent = 0,
    * 二、tr("open image"),對話框的標題  const QString & caption = QString(),
    * 三、 ".":  是對話框顯示時默認打開的目錄,"." 表明程序運行目錄,"/" 表明當前盤符的根目錄(Windows,Linux下/就是根目錄了),也能夠是平臺相關的,好比"C:\\"等;
         例如我想打開程序運行目錄下的Data文件夾做爲默認打開路徑,這裏應該寫成"./Data/",若想有一個默認選中的文件,則在目錄後添加文件名便可:"./Data/teaser.graph"
        const QString & dir = QString(),
    * 四、filter,是對話框的後綴名過濾器,好比咱們使用"Image Files(*.jpg *.png)"就讓它只能顯示後綴名是jpg或者png的文件。若是須要使用多個過濾器,使用";;"分割,
     好比"JPEG Files(*.jpg);;PNG Files(*.png)";const QString & filter = QString(),
    * 第五個參數selectedFilter,是默認選擇的過濾器;
    * 第六個參數options,是對話框的一些參數設定,好比只顯示文件夾等等,它的取值是enum QFileDialog::Option,每一個選項可使用 | 運算組合起來。
    * 若是我要想選擇多個文件怎麼辦呢?Qt提供了getOpenFileNames()函數,其返回值是一個QStringList。你能夠把它理解成一個只能存放QString的List,也就是STL中的list<string>。
    */
    image = imread(filename.toLocal8Bit().data());
    /*
     *  Mat imread(const String& filename,int flags = IMREAD_COLOR);
     * 一、 返回Mat對象
     * 二、參數filename: 待打開圖片的絕對地址,並非全部文件均可以用它打開;函數識別不是依靠文件的後綴名,而是依靠內容的編碼格式;
     *    imread讀取數據時會從新排列數據。
     * 三、 參數flags:打開的參數。它能夠指導將原圖讀取時進行必定的轉換
     *
     * toLocal8Bit:是將QString以本身正確的編碼方式讀取並轉換成編譯器編碼方式的字節流,而string自己就是字節流沒有編碼方式
   */

    QImage img = QImage((const unsigned char*)(image.data),
                            image.cols, image.rows, QImage::Format_RGB888);
    /*
     * QImage 在像素級別上對圖像進行操做
     * QImage在IO操做中有很快的速度,而且給出了訪問像素的接口
    */
    img = img.scaled(ui->label->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
    //讓圖像適應QLabel,不然只顯示一部分
    ui->label->setPixmap(QPixmap::fromImage(img));
    if(image.data)
    {
        ui->reversePushButton->setEnabled(true);
    }
}

void MainWindow::on_reversePushButton_clicked()
{
    flip(image, image, 0);
    /* 一、src,輸入矩陣
     * 二、dst,翻轉後矩陣,類型與src一致
     * 三、翻轉模式,flipCode==0垂直翻轉(沿X軸翻轉),flipCode>0水平翻轉(沿Y軸翻轉),flipCode<0水平垂直翻轉(先沿X軸翻轉,再沿Y軸翻轉,等價於旋轉180°)
    */
    QImage img = QImage((const unsigned char*)(image.data),
                            image.cols, image.rows, QImage::Format_RGB888);\
    img = img.scaled(ui->label->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
    ui->label->clear();
    ui->label->setPixmap(QPixmap::fromImage(img));

}
相關文章
相關標籤/搜索