2009-04-29 10 views
10

Sto usando OpenCV e sto salvando come jpeg utilizzando la funzione cvSaveImage, ma non riesco a trovare il fattore di compressione Jpeg usato da questo.OpenCV cvSaveImage Jpeg Compression Factor

  1. Cosa c'è cvSaveImage (...) Fattore di 's Jpeg Compression
  2. Come posso passare il fattore di compressione quando si utilizza cvSaveImage (...)

risposta

27

Attualmente cvSaveImage() viene dichiarato di prendere solo due parametri:

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

Tuttavia, il "latest tested snapshot" ha:

#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)); 

Sono stato in grado di trovare alcuna documentazione, ma la mia impressione derivante da questo codice è che dovresti creare un array di valori int da passare nel terzo parametro:

int p[3]; 
p[0] = CV_IMWRITE_JPEG_QUALITY; 
p[1] = desired_quality_value; 
p[2] = 0; 

Non so come sia codificato il valore di qualità e non l'ho mai provato, quindi caveat emptor.

Edit:

Essendo un po 'curioso di questo, ho scaricato e costruirono l'ultima versione tronco di OpenCV, ed è stato in grado di confermare quanto sopra tramite questo pezzo di codice usa e getta:

#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); 
} 

Il mio "test.jpg" era 2.054 KB, il "out1.jpg" creato era 182 KB e "out2.jpg" era 4.009 KB.

Sembra che si dovrebbe essere in buona forma assumendo che è possibile utilizzare l'ultimo codice disponibile dal repository Subversion.

BTW, l'intervallo per il parametro di qualità è 0-100, di default è 95.

+0

posto sull'uomo, grazie! –

+0

Riduce la qualità dell'immagine e distorce davvero l'immagine. Consigliamo gentilmente qualsiasi soluzione che riduca le dimensioni del file senza distorcere la qualità dell'immagine. – AnkitRox

1
  1. Probabilmente si può trovare questo cercare nel codice sorgente qui: http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. Non è possibile, poiché la funzione non accetta tale parametro. Se vuoi controllare la compressione, il metodo più semplice che posso immaginare è salvare prima l'immagine come bitmap con cvSaveImage() (o un altro formato senza perdita di tua scelta) e quindi usare un'altra libreria di immagini per convertirla in un JPEG del fattore di compressione desiderato.
5

OpenCV ora has a parameter per impostare la qualità JPEG. Non sono sicuro esattamente quando questo è stato introdotto, ma presumibilmente qualche tempo dopo 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); 

Se si utilizza C++ 0x, si può usare questa notazione più breve:

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 sarà uscita Nome file
  • src dell'immagine sorgente essere letta contenente variabile
  • (vector<int>) typecasting
  • {CV_IMWRITE_JPEG_QUALITY, 20} una serie di elementi per essere passato come Param_ID - e Param_value in funzione imwrite