C++ OpenCV cvSaveImage Jpeg压缩因子

C++ OpenCV cvSaveImage Jpeg压缩因子,c++,image,opencv,jpeg,C++,Image,Opencv,Jpeg,我正在使用OpenCV并使用cvSaveImage函数保存为jpeg,但是我找不到该函数使用的jpeg压缩因子 cvSaveImage(…)的Jpeg压缩系数是多少 使用cvSaveImage(…)时如何传递压缩因子 您可能可以在以下源代码中找到这一点: 您不能,因为函数不接受这样的参数。如果您想控制压缩,那么我能想到的最简单的方法是首先使用cvSaveImage()将图像保存为位图(或您选择的另一种无损格式),然后使用另一个图像库将其转换为所需压缩因子的JPEG 当前,cvSaveImage(

我正在使用OpenCV并使用cvSaveImage函数保存为jpeg,但是我找不到该函数使用的jpeg压缩因子

  • cvSaveImage(…)的Jpeg压缩系数是多少
  • 使用cvSaveImage(…)时如何传递压缩因子
  • 您可能可以在以下源代码中找到这一点:
  • 您不能,因为函数不接受这样的参数。如果您想控制压缩,那么我能想到的最简单的方法是首先使用cvSaveImage()将图像保存为位图(或您选择的另一种无损格式),然后使用另一个图像库将其转换为所需压缩因子的JPEG 当前,cvSaveImage()声明为仅接受两个参数:

    int cvSaveImage( const char* filename, const CvArr* image );
    
    但是,“”具有:

    我一直找不到任何文档,但我对这段代码的印象是,您将构建一个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”是2054KB,创建的“out1.jpg”是182KB,“out2.jpg”是4009KB

    假设您可以使用Subversion存储库中提供的最新代码,那么您的状态应该良好

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

    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);
    
    const int JPEG_QUALITY=80;
    Mat-src;
    //将数据放入src
    向量参数;
    参数推回(CV\u IMWRITE\u JPEG\u质量);
    参数推回(JPEG_质量);
    imwrite(“filename.jpg”,src,params);
    
    如果您使用的是C++0x,则可以使用以下较短的符号:

    imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY});
    
    imwrite(“filename.jpg”,src,vector({CV\u imwrite\u JPEG\u QUALITY,JPEG\u QUALITY});
    
    imwrite(“filename.jpeg”,src,(vector){CV\u imwrite\u jpeg\u QUALITY,20});
    
    • filename.jpeg
      将作为输出文件名
    • src
      be读取包含变量的源图像
    • (向量)
      类型转换
    • {CV_IMWRITE_JPEG_QUALITY,20}
      在IMWRITE函数中作为Param_ID和Param_值传递的元素数组

    它会降低图像质量,并确实会扭曲图像。请建议任何可以在不扭曲图像质量的情况下减少文件大小的解决方案。
    imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY});
    
    imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20});