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

  • 什么是cvSaveImage(...)的Jpeg压缩系数
  • 使用cvSaveImage(...)时如何传递压缩因子

    最佳答案

    当前,cvSaveImage()声明仅接受两个参数:

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

    但是,“latest tested snapshot”具有:
      #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。

  • 07-27 23:40