OpenCV cvSaveImage Jpeg Compression Factor
Domanda
Sto usando OpenCV e sto salvando come jpeg usando la funzione cvSaveImage, ma non riesco a trovare il fattore di compressione Jpeg usato da questo.
- Cos'è il fattore di compressione jpeg di cvSaveImage (...)
- Come posso passare il fattore di compressione quando uso cvSaveImage (...)
Soluzione
Attualmente cvSaveImage () è dichiarato per accettare solo due parametri:
int cvSaveImage( const char* filename, const CvArr* image );
Tuttavia, la " ultima istantanea testata <> quot!; 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) );
Non sono stato in grado di trovare alcuna documentazione, ma la mia impressione da sfogliare questo codice è che dovresti creare una matrice di valori int per passare il 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 avvertimento.
Modifica
Essendo un po 'curioso di questo, ho scaricato e creato l'ultima versione del trunk di OpenCV e sono stato in grado di confermare quanto sopra tramite questo bit 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 " creato; out1.jpg " era 182 KB e " out2.jpg " era 4.009 KB.
Sembra che dovresti essere in buona forma supponendo che tu possa usare l'ultimo codice disponibile dal repository Subversion.
A proposito, l'intervallo per il parametro di qualità è 0-100, il valore predefinito è 95.
Altri suggerimenti
OpenCV ora ha un parametro per impostare la qualità jpeg. Non sono sicuro esattamente quando questo è stato introdotto, ma presumibilmente 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, è possibile utilizzare questa notazione più breve:
imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY});
- Probabilmente puoi trovarlo cercando nel codice sorgente qui: http: // opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
- Non è possibile, poiché la funzione non accetta tale parametro. Se vuoi controllare la compressione, il metodo più semplice a cui riesco a pensare è prima di tutto salvare l'immagine come bitmap con cvSaveImage () (o un altro formato senza perdita di tua scelta) e quindi utilizzare un'altra libreria di immagini per convertirla in JPEG del fattore di compressione desiderato.
imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20});
-
filename.jpeg
verrà generato il nome del file -
src
leggi l'immagine di origine contenente la variabile -
(vector<int>)
typecasting -
{CV_IMWRITE_JPEG_QUALITY, 20}
una matrice di elementi da passare come Param_ID - e Param_value nella funzione di scrittura