Pregunta

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

  1. ¿Qué es el factor de compresión JPEG de cvSaveImage (...)?
  2. ¿Cómo puedo pasar el factor de compresión cuando uso cvSaveImage (...)
¿Fue útil?

Solución

Actualmente se declara que cvSaveImage () toma solo dos parámetros:

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

Sin embargo, el " última instantánea probada " 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) );

No he podido encontrar ninguna documentación, pero mi impresión al leer este código es que crearía una matriz de valores int para pasar 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 tenga cuidado.

Edición :

Siendo un poco curioso acerca de esto, descargué y construí la última versión troncal de OpenCV, y pude confirmar lo anterior a través de este código desechable:

#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 de 2.054 KB, el " out1.jpg " fue de 182 KB y & "; out2.jpg &"; era 4,009 KB.

Parece que debería estar en buena forma suponiendo que puede usar el último código disponible en el repositorio de Subversion.

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

Otros consejos

OpenCV ahora tiene un parámetro para establecer la calidad de jpeg. No estoy seguro exactamente cuándo se introdujo esto, pero presumiblemente en algún momento 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á usando C ++ 0x, puede usar esta notación más corta:

imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY});
  1. Probablemente pueda 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, el método más simple que se me ocurre es primero guardar su imagen como un mapa de bits con cvSaveImage () (u otro formato sin pérdidas de su elección) y luego usar otra biblioteca de imágenes para convertirla a un JPEG del factor de compresión deseado.
imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20});
  • filename.jpeg se mostrará el nombre del archivo
  • src leer la imagen de origen que contiene la variable
  • (vector<int>) conversión de texto
  • {CV_IMWRITE_JPEG_QUALITY, 20} una matriz de elementos para pasar como Param_ID - y Param_value en la función imwrite
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top