2009-04-29 100 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傳遞 - 在人