在没有压缩的情况下以较小的尺寸打开CV图像

时间:2013-11-13 10:36:05

标签: c++ opencv visual-studio-2012

我的问题如下: 我有一个相机(分辨率分辨率: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通道设置

如果有人知道答案,请告诉我,我将非常感激 谢谢你的时间!

3 个答案:

答案 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。