在 C++ 中使用 OpenCV 保存 cv::Mat 图像,可以使用 cv::imwrite() 函数。以下是几种常见情况的示例代码:
1. 基本保存(适用于普通图像如 JPEG、PNG)
#include <opencv2/opencv.hpp>
int main() {
// 假设有一个 cv::Mat 图像
cv::Mat image = cv::imread("input.jpg"); // 读取图像
if (image.empty()) {
std::cerr << "Error: Could not load image!" << std::endl;
return -1;
}
// 保存为 JPEG(默认质量95)
bool success = cv::imwrite("output.jpg", image);
// 保存为 PNG(无损压缩)
// bool success = cv::imwrite("output.png", image);
if (!success) {
std::cerr << "Error: Failed to save image!" << std::endl;
return -1;
}
std::cout << "Image saved successfully." << std::endl;
return 0;
}
2. 保存浮点矩阵(如相位图、深度图等)
如果 cv::Mat 是浮点类型(如 CV_32F/CV_64F),需要先归一化到 0-255:
#include <opencv2/opencv.hpp>
int main() {
// 假设有一个浮点矩阵(例如相位图)
cv::Mat floatMat = ...; // CV_32F or CV_64F
// 归一化到 [0, 255] 并转换为8UC1
cv::Mat saveMat;
double minVal, maxVal;
cv::minMaxLoc(floatMat, &minVal, &maxVal);
if (maxVal > minVal) {
floatMat.convertTo(saveMat, CV_8UC1, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal));
} else {
saveMat = cv::Mat::zeros(floatMat.size(), CV_8UC1);
}
// 保存为PNG(推荐无损格式)
cv::imwrite("float_output.png", saveMat);
return 0;
}
3. XML/YAML格式存储(保留原始数据精度)
如果需要保留浮点数据的完整精度,可以保存为XML/YAML:
#include <opencv2/opencv.hpp>
int main() {
cv::Mat mat = ...; // CV_32F or CV_64F
// 保存为XML
cv::FileStorage fs("matrix.xml", cv::FileStorage::WRITE);
fs << "mat" << mat;
或者:
直接调用:
```cpp
cvSave(("matrix.yml", mat);
}
std :: cout<<“Matrix saved to matrix.xml”< return 0 ;
}
“` 确保目标路径有写入权限,文件名需包含扩展名(如
关键说明
函数
用途
适用场景
cv :: imwrite()保存常规图像
JPEG/PNG/BMP等格式
归一化 +
imwrite()浮点矩阵可视化
相位图、深度图
FileStorage保留原始数据精度
XML/YAML格式
.jpg, .png)。
内容由零声教学AI助手提供,问题来源于学员提问




