2.1 讀取、儲存與顯示圖片

本偏要介紹的是OpenCV最基礎也是最重要的功能,即圖片的讀取以及顯示,本篇會簡單介紹幾種顯示圖片的方法,包含從Qt UI上面顯示,或是直接調用OpenCV內部的顯示圖片功能。

讀取圖片

OpenCV下讀取圖片的程式碼如下

cv::Mat imgSrc = cv::imread(<檔案路徑>);
cv::UMat Uimg;
imgSrc.copyTo(Uimg);

cv::Mat為OpenCV存放圖片的核心資料型態,基本上就是用一個array去存放相關的資料。

cv::UMat為OpenCV 3.0下新的存放圖片的核心資料型態,他跟cv::Mat很像但是能夠自動在GPU與CPU做運做運算。

搭配Qt中的QFileDialog可以實現透過開啟系統讀取對話框選擇圖片讀入。

//Open a Qt Dialog to get file name path.
fileName = QFileDialog::getOpenFileName(this,tr("Open File"));
//OpenCV read image to mat.
imgSrc = cv::imread(fileName.toStdString());

儲存圖片

OpenCV中寫入圖片的程式碼如下:

cv::imwrite(<檔案路徑>, <cv::Mat>);

搭配Qt的QFileDialog可以實現透過開啟系統存取對話框選擇圖片儲存位置。

//Open a Qt Dialog to get save file name path.
    fileName = QFileDialog::getSaveFileName(this,tr("Close File"));

    if(!fileName.isEmpty())
        for(int i =0; i < img.size();i++)
        {
            //Rename if multiple image saving is required.
            QString a = fileName + "_"+QString::number(i)+".png";
            if(!img[i].empty())
                //OpenCV save image.
                cv::imwrite(a.toStdString(),img[i]);
        }

顯示圖片

顯示圖片這邊會介紹三種方法

  1. cv::imshow

    cv::imshow為OpenCV內建的顯示圖片函式

    cv::imshow(<視窗名稱>, <cv::Mat>);
    
  2. Qt的label

    Qt的QLabel接受的型態為QImage,所以需要先將OpenCV的cv::Mat資料型態改成QImage。

    OpenCV cv::Mat轉成QImage的是程式碼如下:

    //Change UMat colorchannel from BGR to RGB.
    cv::cvtColor(img,img,cv::COLOR_BGR2RGB);
    //Port image data from UMat to QImage.
    QImage tmp(img.getMat(1).data,
               img.cols,
               img.rows,
               img.step,
               QImage::Format_RGB888);
    

    由於OpenCV儲存彩色圖片是以BGR的順序儲存,而QImage是以RGB的順序儲存,因此需要使用cv::cvtColor函式先將BGR轉乘RGB。

    再來再將圖片存入Qt Label:

    ui->label->setPixmap(QPixmap::fromImage(tmp));
    

    這邊要特別注意如果你的cv::UMat或是cv::Mat在輸出到label上面後如果還需要繼續進行運算或如果還需要繼續進行運算或使用,務必要使用cv::cvtColor將RGB轉回BGR。

  3. qsmartgraphicsview (https://github.com/KKyang/qtsmartgraphics)

    qsmartgraphicsview在連結中的有詳細的介紹。

範例程式

Project

mainwindow.h

mainwindow.cpp