如果你用 cvSaveImage 直接把 cv::Mat 数据保存为图片,则有可能有下列问题:

OpenCV Error: Bad argument (Unknown array type) in cvarrToMat, file /home/water/soft/OpenCV-2.3.1/modules/core/src/matrix.cpp, line 646
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/water/soft/OpenCV-2.3.1/modules/core/src/matrix.cpp:646: error: (-5) Unknown array type in function cvarrToMat

这个时候,可以先把 cv::Mat 转为 IplImage 再用 cvSaveImage 来保存,直接用 IplImage 可以直接强制类型转 cv::Mat 为 IplImage 数据类型。

下面这段代码示例,是从硬盘里读取一个图片文件的二进制数据为 cv::Mat 数据结构,然后再转为 IplImage 数据结构并保存为新的图片文件。

const char* filename = "./testImages/12.jpg";

std::ifstream file(filename);
std::vector<char> data;

file >> std::noskipws;
std::copy(std::istream_iterator<char>(file), std::istream_iterator<char>(), std::back_inserter(data));


cv::Mat matrixJprg = cv::imdecode(cv::Mat(data), 1);
IplImage qImg;
qImg = IplImage(matrixJprg); // cv::Mat -> IplImage

cvSaveImage("./out.jpg", &qImg);

当然,其实还有更简单的方法:

cv::Mat image = GetImageBuff();//获取 cv::Mat 数据,根据实际业务编写
cv::imwrite("test.jpg", image);