0

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

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

4

3 回答 3

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);
于 2013-11-13T10:54:50.567 回答
1

您可以将图像另存为PNG无损图像压缩格式。

bool succes = imwrite("D:\\TestImage3.png",img2);
于 2013-11-13T10:46:18.410 回答
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。

于 2013-11-13T10:50:51.193 回答