我的问题如下: 我有一个相机(分辨率分辨率:640 x 480像素),我从图像采集后得到一个图像(我得到一个8位/像素的灰度图像)我以bmp格式保存图像。我的代码是以下内容:
Mat img2(640,480,CV_8UC1,0)
;
cap.read(img2);
bool succes = imwrite("D:\\TestImage3.bmp",img2);
if(!succes){
cout << "Failed to save the image";
return -1;
}
namedWindow("myWindow",CV_WINDOW_AUTOSIZE);
imshow("myWindow",img2);
保存的图像非常大,大约1 MB,我想要一个较小的图像,而不会丢失任何信息(没有压缩图像)???
关于这个主题的第二个问题是: 即使图像是灰色的,我仍然会得到一些rgb噪声,就像我会为我的图像设置3通道设置而不是1通道设置
如果有人知道答案,请告诉我,我将非常感激 谢谢你的时间!
答案 0 :(得分:1)
您可以将图像保存为PNG
,这是一种无损图像压缩格式。
bool succes = imwrite("D:\\TestImage3.png",img2);
答案 1 :(得分:1)
使用cv :: imwrite函数,您可以根据图像格式传递其他参数。 PNG是一种无损图像格式,但您仍然可以选择压缩级别,例如:
Mat img2;
cap.read(img2);
cvtColor(img2, img2, CV_BGR2GRAY); // Convert to single channel
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
bool succes = imwrite("D:\\TestImage3.bmp", img2, compression_params);
if(!succes)
{
cout << "Failed to save the image"; return -1;
}
imshow("myWindow",img2);
waitKey(0);
答案 2 :(得分:0)
只使用Mat的默认构造函数,没有参数。
Mat img2;
cap.read(img2);
cvtColor(img2, img2, CV_BGR2GRAY); // Convert to single channel
bool succes = imwrite("D:\\TestImage3.bmp", img2);
if(!succes)
{
cout << "Failed to save the image"; return -1;
}
imshow("myWindow",img2);
waitKey(0);
此外,bmp以其未压缩的大尺寸而闻名。请改用.png。