2009-04-29 13 views
10

Estoy usando OpenCV y guardando como un jpeg usando la función cvSaveImage, pero no puedo encontrar el factor de compresión Jpeg utilizado por esto.OpenCV cvSaveImage Jpeg Compression Factor

  1. lo que está cvSaveImage (...) Factor 's compresión JPEG
  2. ¿Cómo puedo pasar el factor de compresión cuando se utiliza cvSaveImage (...)

Respuesta

27

Actualmente cvSaveImage() se declara a tomar sólo dos parámetros:

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

Sin embargo, el "latest tested snapshot" tiene:

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

he sido incapaz de encontrar ninguna documentación, pero mi impresión al hurgar en este código es que construiría una matriz de valores int para pasar en el tercer parámetro:

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

No sé cómo se codifica el valor de calidad, y nunca lo he intentado, así que caveat emptor.

Editar:

Siendo un poco curioso de este, he descargado y construyó la versión más reciente de tronco de OpenCV, y fue capaz de confirmar lo anterior a través de este trozo de código de usar y tirar:

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

Mi "test.jpg" fue 2.054 KB, el "out1.jpg" creado fue 182 KB y "out2.jpg" fue 4.009 KB.

Parece que debe estar en buen estado suponiendo que puede utilizar el último código disponible del repositorio de Subversion.

Por cierto, el rango para el parámetro de calidad es 0-100, por defecto es 95.

+0

lugar en el hombre, gracias! –

+0

Reduce la calidad de la imagen y realmente distorsiona la imagen. Sugiera amablemente cualquier solución que reduzca el tamaño del archivo sin distorsionar la calidad de la imagen. – AnkitRox

1
  1. probablemente puede encontrar esto hurgando en el código fuente aquí: http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. No puede, ya que la función no acepta dicho parámetro. Si desea controlar la compresión, entonces el método más sencillo que puedo pensar es primero guardar su imagen como un mapa de bits con cvSaveImage() (u otro formato sin pérdida de su elección) y luego usar otra biblioteca de imágenes para convertirlo a JPEG del factor de compresión deseado.
5

OpenCV ahora has a parameter para establecer la calidad JPEG. No estoy seguro exactamente cuando esto fue presentado, pero presumiblemente después de 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); 

Si está utilizando C++ 0x, puede utilizar esta notación más corta:

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 será el nombre del archivo de salida
  • src imagen de origen que contiene leerse variable
  • (vector<int>) typecasting
  • {CV_IMWRITE_JPEG_QUALITY, 20} una serie de elementos que se pasa como Param_ID - Param_value y en función de imwrite