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]);
}
顯示圖片
顯示圖片這邊會介紹三種方法
cv::imshow
cv::imshow
為OpenCV內建的顯示圖片函式cv::imshow(<視窗名稱>, <cv::Mat>);
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。qsmartgraphicsview (https://github.com/KKyang/qtsmartgraphics)
qsmartgraphicsview在連結中的有詳細的介紹。