OpenCV cvSaveImage Jpeg 压缩因子

问题描述 投票:0回答:4

我正在使用 OpenCV 并使用 cvSaveImage 函数另存为 jpeg,但我无法找到其使用的 Jpeg 压缩因子。

  1. cvSaveImage(...) 的 Jpeg 压缩因子是多少
  2. 使用cvSaveImage(...)时如何传递压缩因子
c++ image opencv jpeg
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。


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
投票
  1. 您可能可以通过在这里查看源代码来找到它:http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. 不能,因为该函数不接受这样的参数。如果你想控制压缩,那么我能想到的最简单的方法是首先使用 cvSaveImage() (或你选择的其他无损格式)将图像保存为位图,然后使用另一个图像库将其转换为 JPEG所需的压缩系数。

1
投票

将 JPEG 质量值作为“params”参数的元素之一传递给

cv::imwrite()
:

cv::imwrite("filename.jpeg", src, {cv::IMWRITE_JPEG_QUALITY, 20});

这里的论据是:

  • "filename.jpeg"
    :输出文件名
  • src
    cv::Mat
    图像
  • {cv::IMWRITE_JPEG_QUALITY, 20}
    :一个
    std::vector
    整数,解释为
    cv::ImwriteFlags
    值及其对应值对。
© www.soinside.com 2019 - 2024. All rights reserved.