在 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] 并转换为8UC1cv::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// 保存为XMLcv::FileStorage fs("matrix.xml", cv::FileStorage::WRITE);fs << "mat" << mat;或者:直接调用:```cppcvSave(("matrix.yml", mat);
}
std :: cout<<“Matrix saved to matrix.xml”<
return 0 ; } “`
关键说明
| 函数 | 用途 | 适用场景 |
|---|---|---|
cv :: imwrite() |
保存常规图像 | JPEG/PNG/BMP等格式 |
归一化 + imwrite() |
浮点矩阵可视化 | 相位图、深度图 |
FileStorage |
保留原始数据精度 | XML/YAML格式 |
确保目标路径有写入权限,文件名需包含扩展名(如 .jpg, .png)。
内容由零声教学AI助手提供,问题来源于学员提问




