OpenCV cvSaveImage Jpeg 压缩因子

12
我正在使用OpenCV并使用cvSaveImage函数保存为JPEG格式,但我无法找到该函数使用的JPEG压缩系数。
  1. cvSaveImage(...)的JPEG压缩系数是多少?
  2. 在使用cvSaveImage(...)时如何传递压缩系数?
4个回答

27

目前 cvSaveImage() 声明只接受两个参数:

int cvSaveImage( const char* filename, const CvArr* image );

然而,"最新测试快照" 具有以下特点:

  #define CV_IMWRITE_JPEG_QUALITY 1
  #define CV_IMWRITE_PNG_COMPRESSION 16
  #define CV_IMWRITE_PXM_BINARY 32

  /* save image to file */
  CVAPI(int) cvSaveImage( const char* filename, const CvArr* image,
                          const int* params CV_DEFAULT(0) );

我找不到任何文档,但从查看这段代码的印象来看,您需要构建一个 int 值数组作为第三个参数传递:

int p[3];
p[0] = CV_IMWRITE_JPEG_QUALITY;
p[1] = desired_quality_value;
p[2] = 0;

我不知道质量值是如何编码的,也从未尝试过,所以请自行决定。

编辑:

对此有些好奇,我下载并构建了最新的OpenCV主干版本,并通过这段一次性代码确认了上述内容:

#include "cv.h"
#include "highgui.h"
int main(int argc, char **argv)
{
    int p[3];
    IplImage *img = cvLoadImage("test.jpg");

    p[0] = CV_IMWRITE_JPEG_QUALITY;
    p[1] = 10;
    p[2] = 0;

    cvSaveImage("out1.jpg", img, p);

    p[0] = CV_IMWRITE_JPEG_QUALITY;
    p[1] = 100;
    p[2] = 0;

    cvSaveImage("out2.jpg", img, p);

    exit(0);
}

我的"test.jpg"文件大小为2,054 KB,生成的"out1.jpg"为182 KB,"out2.jpg"为4,009 KB。

看起来只要您能使用Subversion存储库中最新的可用代码,就应该没问题了。

顺便说一下,质量参数的范围是0-100,默认值为95。


它会降低图像质量并且真正扭曲图像。请提供任何可以在不失真的情况下减小文件大小的解决方案。 - AnkitRox

7

现在,OpenCV已经拥有一个参数来设置jpeg质量。我不确定这是什么时候引入的,但可能是在2.0之后的某个时间。

const int JPEG_QUALITY = 80;

Mat src;
// put data in src

vector<int> params;
params.push_back(CV_IMWRITE_JPEG_QUALITY);
params.push_back(JPEG_QUALITY);

imwrite("filename.jpg", src, params);

如果您正在使用C++0x,可以使用这种更短的表示法:
imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY});

1
imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20});
  • filename.jpeg将成为输出文件名
  • src是包含变量的源图像读取
  • (vector<int>)强制类型转换
  • {CV_IMWRITE_JPEG_QUALITY, 20}是要作为imwrite函数中Param_ID和Param_value传递的元素数组

1
  1. 你可以在这里的源代码中找到它:http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. 不行,因为该函数不接受这样的参数。如果你想控制压缩率,我能想到的最简单的方法是先用cvSaveImage()(或其他无损格式)将图像保存为位图,然后使用另一个图像库将其转换为所需压缩系数的JPEG。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接