- 從零開始:數字圖像處理的編程基礎與應用
- 彭凌西 彭紹湖 唐春明 陳統編著
- 1225字
- 2022-04-13 16:24:01
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'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'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程序運行結果
- Google Apps Script for Beginners
- The DevOps 2.3 Toolkit
- PHP基礎案例教程
- 精通軟件性能測試與LoadRunner實戰(第2版)
- TypeScript實戰指南
- 用Python實現深度學習框架
- 深入淺出Serverless:技術原理與應用實踐
- Visual Basic程序設計實驗指導(第二版)
- C語言從入門到精通
- Service Mesh實戰:基于Linkerd和Kubernetes的微服務實踐
- MySQL入門很輕松(微課超值版)
- Android傳感器開發與智能設備案例實戰
- Java設計模式深入研究
- Go Systems Programming
- Spring Boot 3:入門與應用實戰