修正:轉換出來的圖片顏色不對勁,必須處理:編輯器
/*圖片的顯示主要問題仍是在於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)); }