? ? 在圖像處理項目中,圖像的 讀取(imread)、顯示(imshow) 和 保存(imwrite) 是最基礎也是最常用的三個操作。本文將詳細介紹這三個函數的功能、用法和注意事項,并提供一個完整示例供讀者上手測試。
一、cv::imread:讀取圖像文件
cv::Mat cv::imread(const std::string& filename, int flags = cv::IMREAD_COLOR);
參數說明:
filename
: 要讀取的圖像文件路徑(支持 jpg, png, bmp 等格式)。flags
: 指定圖像的讀取方式:cv::IMREAD_COLOR
:以 BGR 方式讀取彩色圖像(默認)。cv::IMREAD_GRAYSCALE
:讀取為灰度圖像。cv::IMREAD_UNCHANGED
:按原始數據讀取,包括 alpha 通道。
返回值:
成功時返回
cv::Mat
圖像矩陣。如果讀取失敗(路徑錯誤或文件不存在),返回空矩陣,即
img.empty() == true
。
二、cv::imshow:顯示圖像窗口
void cv::imshow(const std::string& winname, cv::InputArray mat);
?參數說明:
winname
: 顯示窗口的名稱(如果不存在則創建)。mat
: 要顯示的圖像矩陣,通常是cv::Mat
類型。
注意事項:
imshow
需要配合cv::waitKey()
使用,否則窗口會一閃而過。GUI 線程必須存在(某些遠程終端不支持 GUI)。
三、cv::imwrite:保存圖像到文件
bool cv::imwrite(const std::string& filename, cv::InputArray img);
參數說明:
filename
: 要保存的圖像路徑及文件名(自動識別擴展名如.png
,.jpg
等)。img
: 要保存的圖像矩陣。
返回值:
true
表示保存成功,false
表示保存失敗(如路徑錯誤或無寫權限)。
四、完整示例代碼
下面我們結合上述三個函數寫一個完整的小程序,實現:
從文件讀取圖像;
顯示圖像;
將圖像保存為新的文件。
#include <iostream>int main()
{// 讀取圖像,返回cv::Mat保存圖像數據// IMREAD_COLOR:以三通道彩色圖像讀取,如果原始數據為灰度圖,返回圖像被轉換為彩色圖像// IMREAD_GRAYSCALE:以灰度圖像讀取,如果原數據為彩色圖,使用加權方式轉換:gray=red*0.299 + green*0.587 + blue*0.114// IMREAD_UNCHANGED:保持原數據通道數,如果包含alpha通道,同樣保留std::string input_path = "1.jpg";cv::Mat img = cv::imread(input_path, cv::IMREAD_COLOR);if (img.empty()) {std::cerr << "圖像讀取失敗,請確認路徑是否正確:" << input_path << std::endl;return -1;}// 創建窗口,窗口命名為"圖像顯示",后續所有關于該窗口的操作均以字符串"圖像顯示"進行檢索// WINDOW_NORMAL: 用戶可調整窗口尺寸與位置,顯示圖像時圖像被壓縮到窗口尺寸進行顯示// WINDOW_AUTOSIZE(默認參數): 窗口尺寸自動匹配圖像大小,如果顯示圖像大于顯示器分辨率,則無法完全呈現cv::namedWindow("圖像顯示", cv::WINDOW_NORMAL);// 調整窗口尺寸與位置cv::resizeWindow("圖像顯示", 640, 480);cv::moveWindow("圖像顯示", 0, 0);// 顯示圖像,原始圖像被縮放與窗口尺寸一致后再顯示cv::imshow("圖像顯示", img);std::cout << "圖像已顯示,請按任意鍵關閉窗口..." << std::endl;cv::waitKey(0); // 必須等待,否則窗口會立即關閉// 設置jpg壓縮質量,該壓縮方式為有損壓縮// 壓縮質量:0 - 100,數值越大,細節保留越多,圖像文件越大std::vector<int> compression_params;compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);compression_params.push_back(80); // 保存為jpg圖像,當參數compression_params為空時,默認壓縮質量為95std::string output_path = "output_saved.jpg";cv::imwrite(output_path, img, compression_params);// 設置png壓縮等級為6,該壓縮方式為無損壓縮// 壓縮等級:0-9,數值越大,壓縮速度越慢,文件越小// 不管壓縮等級為多少,解壓后都不會丟失圖像信息!std::vector<int> compression_params2;compression_params2.push_back(cv::IMWRITE_PNG_COMPRESSION);compression_params2.push_back(9); // 壓縮等級// 保存為png圖像,當參數compression_params2為空時,默認壓縮等級為3std::string output_path2 = "output_saved.png";cv::imwrite(output_path2, img, compression_params2);return 0;
}