官术网_书友最值得收藏!

1.4 圖像讀取與保存

對于OpenCV中圖像的讀取,前文(1.2.4小節和1.2.5小節)已略有提及,本節將詳細介紹OpenCV中圖像的讀取與保存方法。

· 1.4.1 圖像讀取

在OpenCV中,使用cv::imread()函數來讀取和加載圖像,該函數的形式如下。

Mat cv::imread(const String & filename, int flags = IMREAD_COLOR)          

可以看到,imread()函數的定義非常簡單,其解析如下。

  • 返回值Mat 類型:返回讀取的圖像,讀取圖像失敗時返回一個空的矩陣對象(Mat::data == NULL)。
  • 參數filename:讀取圖像的文件名,可以使用相對路徑或者絕對路徑,但必須帶完整的文件擴展名(圖像格式后綴)。
  • 參數flags:一個讀取標記,用于選擇讀取圖像的方式,默認值為IMREAD_COLOR,flags值的設定與用什么顏色格式讀取圖像有關。

此外,imread()函數支持讀取的常用圖像格式有如下幾種。

  • Windows bitmaps:*.bmp,*.dib。
  • JPEG files :*.jpg, *.jpg, *.jpe。
  • JPEG 2000 files:*.jp2。
  • Portable Network Graphics:*.jpg。

imread()函數中參數的標識flags值被定義在enum cv::ImreadModes枚舉類里面,其值及含義如表1-1所示。

表1-1 imread()函數的參數flags的值及其含義

下面將創建例1-2來實現并展示圖像的讀取操作。

例1-2:圖像的讀取。

具體操作過程如下。

(1)在.pro文件中配置OpenCV環境。

# 導入頭文件
INCLUDEPATH+=D:/OpenCV/opencv/build/include
INCLUDEPATH+=D:/opencv/opencv/build/include/opencv2
# 導入庫文件
win32:CONFIG(debug, debug|release):{
LIBS+=-LD:/OpenCV/opencv/build/x64/vc14/lib\
-lopencv_world440d
}
else{
LIBS+=-LD:/OpenCV/opencv/build/x64/vc14/lib\
-lopencv_world440
}

(2)編輯main.cpp文件(需要提前將touxiang.jpg文件放入D盤images文件夾中)。

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{ //讀取圖像
Mat image = imread("D:/images/touxiang.jpg");
if (image.data != NULL)
{ //顯示圖像
imshow("touxiang",image);
waitKey(0);
}
else{
cout << "can&apos;t open the file!" << endl;
getchar();
}
return 0;
}

(3)對項目進行QMake編譯和構建后,程序運行結果如圖1-49所示。

圖1-49 例1-2程序運行結果

注意

  • imshow()函數應用簡單,函數定義為cv::imshow ( const String & winname, InputArray mat )。參數const String & winname為顯示的窗口名, 可以使用cv::namedWindow()函數創建窗口,如不創建,imshow()函數將自動創建;參數InputArray mat為待顯示的圖像。需要注意的是,imshow()函數之后必須有waitKey()函數,否則顯示窗口將一閃而過,不會駐留屏幕。inputArray這個接口類可以是Mat、Mat_<T>、Mat_<T, m, n>、vector<T>、vector<vector<T>>、vector<Mat>,也就意味著函數的參數類型是InputArray型時,把上述幾種類型作為參數都可以。另外,OutputArrayOfArrays、InputOutputArray、InputOutputArrayOfArrays都是OutputArray的別名。
  • waitKey()函數是OpenCV中的內置函數,語句waitKey(0)表示“暫停程序,等待一個按鍵輸入”,也就是說,當程序執行到waitKey(0)時暫停運行,只有當用戶按下一個按鍵時,它才會繼續運行。

· 1.4.2 圖像保存

同圖像讀取類似,OpenCV中使用cv::imwrite()函數實現將圖像保存到指定的文件,該函數定義如下。

bool cv::imwrite(const String & filename,
InputArray img,
const std::vector<int> & params = std::vector<int>() );

imwrite()函數的參數解析如下。

  • const String & filename:需要保存圖像的文件名,要保存圖像為哪種格式,就帶什么擴展名。
  • InputArray img:要保存的圖像。
  • const Std::Vector <int> & params:表示為特定格式保存的參數編碼。

需要注意的是,imwrite()函數是基于文件擴展名選擇圖像的格式。通常,使用此功能只能保存8位單通道或三通道(帶有BGR通道順序)圖像,但有以下例外。

  • 對于PNG、JPEG2000和TIFF格式,可以保存16位無符號(CV_16U)圖像。
  • 32位浮點(CV_32F)圖像可以保存為PFM、TIFF、OpenEXR和Radiance HDR格式,可使用LogLuv高動態范圍編碼(每像素4字節)保存三通道(CV_32FC3)TIFF格式圖像。
  • 可以使用此功能保存帶有alpha通道的PNG格式圖像。為此,創建8位(或16位)四通道BGRA圖像,其中alpha通道在最后。完全透明的像素應該將alpha通道的值設置為0,完全不透明的像素應該將alpha通道的值設置為255/65535。

imwrite()函數中特定格式的編碼參數及其含義如表1-2所示。

表1-2 imwrite()函數中特定格式的編碼參數及其含義

下面將通過例1-3展示圖像的加載和保存操作。

例1-3:圖像的加載和保存。

操作過程如下。

(1)在.pro文件中配置OpenCV環境。

# 導入頭文件
INCLUDEPATH+=D:/OpenCV/opencv/build/include
INCLUDEPATH+=D:/opencv/opencv/build/include/opencv2
# 導入庫文件
win32:CONFIG(debug, debug|release):{
LIBS+=-LD:/OpenCV/opencv/build/x64/vc14/lib\
-lopencv_world440d
}
else{
LIBS+=-LD:/OpenCV/opencv/build/x64/vc14/lib\
-lopencv_world440
}

(2)編輯main.cpp文件(需要提前將touxiang.jpg文件放入D盤images文件夾中)。

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat image;
//加載圖像
image = cv::imread("D:/images/touxiang.jpg");
if (image.empty())
{
cout << "can&apos;t open the file!" << endl;
return -1;
}
imshow("main window", image);
//保存圖像到當前項目
imwrite("D:/images/save.jpg", image);
waitKey(0);
//銷毀所有窗口
destroyAllWindows();
return 0;
}

(3)程序運行結果如圖1-50所示。

圖1-50 例1-3程序運行結果

主站蜘蛛池模板: 化州市| 台中县| 教育| 新沂市| 南陵县| 越西县| 安陆市| 托里县| 新乐市| 米脂县| 汉中市| 潼南县| 双柏县| 麟游县| 资阳市| 炉霍县| 建湖县| 海林市| 舒兰市| 东乡族自治县| 武邑县| 如东县| 台北市| 惠东县| 潮州市| 龙陵县| 滕州市| 麦盖提县| 东源县| 阿尔山市| 农安县| 茌平县| 高州市| 浪卡子县| 南川市| 曲松县| 河曲县| 长垣县| 民勤县| 大石桥市| 崇礼县|