cv::Mat无损压缩
时间: 2024-01-11 16:04:50 浏览: 255
根据提供的引用内容,可以使用OpenCV库中的imencode()函数对cv::Mat进行无损压缩。具体步骤如下:
1. 导入OpenCV库
```cpp
#include <opencv2/opencv.hpp>
```
2. 读取图像并进行压缩
```cpp
cv::Mat img = cv::imread("example.jpg"); // 读取图像
std::vector<uchar> buf; // 定义压缩后的数据存储向量
cv::imencode(".jpg", img, buf); // 对图像进行压缩
```
其中,第一个参数".jpg"表示压缩后的格式为jpg格式,第二个参数img为待压缩的图像,第三个参数buf为压缩后的数据存储向量。
3. 对压缩后的数据进行解码
```cpp
cv::Mat img_decode = cv::imdecode(buf, cv::IMREAD_COLOR); // 对压缩后的数据进行解码
```
其中,第一个参数buf为压缩后的数据存储向量,第二个参数cv::IMREAD_COLOR表示解码后的图像为彩色图像。
相关问题
报错 cv2.imwrite(r'./pgd_img/adver_results/{}.jpg'.format(i), np.transpose(adv_imgs), (1, 2, 0)) cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp:738: error: (-2:Unspecified error) in function 'bool __cdecl cv::imwrite_(const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &,const class std::vector<class cv::Mat,class std::allocator<class cv::Mat> > &,const class std::vector<int,class std::allocator<int> > &,bool)' > Encoding 'params' must be key-value pairs: > '(params.size() & 1) == 0' > where > 'params.size()' is 3
这个报错提示参数设置有误,具体来说是imwrite函数的第三个参数不符合要求。根据报错信息,看起来是传递的参数列表长度不符合要求,需要使用key-value pairs来设置参数。建议检查一下传递给imwrite函数的第三个参数是否正确,应该使用一个字典来设置参数,其中包含图像的编码方式、压缩质量等参数。例如可以这样设置:
```
cv2.imwrite(r'./pgd_img/adver_results/{}.jpg'.format(i), np.transpose(adv_imgs, (1, 2, 0)), params={"quality": 100})
```
其中,quality表示JPEG图像的压缩质量,取值范围是0-100,100表示无损压缩。经过上述修改后,应该就可以成功保存图像了。
OpenCV实现对图像的无损压缩
OpenCV提供了多种图像压缩算法,包括无损压缩算法,可以实现对图像的无损压缩。其中,比较常用的无损压缩算法有PNG和TIFF格式。
对于PNG格式,可以使用cv::imwrite函数将图像以PNG格式保存到文件中,这样就可以实现对图像的无损压缩。具体代码如下:
```cpp
cv::Mat image = cv::imread("input.jpg");
cv::imwrite("output.png", image);
```
对于TIFF格式,需要安装libtiff库,并在编译时链接该库。具体代码如下:
```cpp
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <tiffio.h>
int main()
{
cv::Mat image = cv::imread("input.jpg");
TIFF* tiff = TIFFOpen("output.tif", "w");
int width = image.cols;
int height = image.rows;
int channels = image.channels();
TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, height);
TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, channels);
TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8);
TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tiff, width * channels));
TIFFWriteEncodedStrip(tiff, 0, image.data, width * height * channels);
TIFFClose(tiff);
return 0;
}
```
这样,就可以将图像以TIFF格式保存到文件中,实现对图像的无损压缩。
阅读全文