2009-04-29 99 views
10

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

  1. 什么cvSaveImage(...)的Jpeg格式压缩因子
  2. 我如何使用cvSaveImage(...)

回答

27

目前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; 

我不知道质量值是如何编码的,我从来没有试过这个,所以要警惕emptor。

编辑:

作为一个有点好奇,我下载和建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版本库中的最新代码。

BTW,对于质量参数的范围是0-100,默认为95

+0

斑点和Param_value在imwrite功能,谢谢! – 2009-05-05 16:58:05

1
  1. 你或许可以找到这个时候通过压缩因子在这里查看源代码:http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. 你不能,因为函数不接受这样的参数。如果你想控制压缩,那么我能想到的最简单的方法是首先将图像保存为带有cvSaveImage()(或您选择的另一种无损格式)的位图,然后使用另一个图像库将其转换为JPEG期望的压缩因子。
5

的OpenCV现在has a parameter设置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}); 
0
imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20}); 
  • filename.jpeg将输出文件名
  • src是源图像读取包含变量
  • (vector<int>)类型转换
  • {CV_IMWRITE_JPEG_QUALITY, 20}元件的阵列为Param_ID传递 - 在人