Question

J'utilise OpenCV et j'enregistre au format jpeg à l'aide de la fonction cvSaveImage, mais je ne parviens pas à trouver le facteur de compression Jpeg utilisé par cela.

  1. Qu'est-ce que le facteur de compression Jpeg de cvSaveImage (...)
  2. Comment puis-je passer le facteur de compression lors de l'utilisation de cvSaveImage (...)
Était-ce utile?

La solution

Actuellement, cvSaveImage () est déclaré pour ne prendre que deux paramètres:

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

Toutefois, le " dernier instantané testé " a:

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

Je suis incapable de trouver de la documentation, mais mon impression de fouiller dans ce code est que vous construisez un tableau de valeurs int à transmettre dans le troisième paramètre:

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

Je ne sais pas comment la valeur de qualité est codée, et je n’ai jamais essayé cela, c’est pourquoi mise en garde.

Modifier:

Etant un peu curieux à ce sujet, j'ai téléchargé et construit la dernière version trunk d'OpenCV, et j'ai pu confirmer ce qui précède via ce code jetable:

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

Mon " test.jpg " était de 2 054 Ko, le " créé1.jpg " créé; était de 182 Ko et " out2.jpg " était de 4 009 Ko.

Il semble que vous devriez être en forme en supposant que vous puissiez utiliser le dernier code disponible dans le référentiel Subversion.

BTW, la plage du paramètre de qualité est comprise entre 0 et 100, la valeur par défaut est 95.

Autres conseils

OpenCV maintenant dispose d'un paramètre pour définir la qualité jpeg. Je ne sais pas exactement quand cela a été introduit, mais probablement après la version 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 vous utilisez C ++ 0x, vous pouvez utiliser cette notation plus courte:

imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY});
  1. Vous pouvez probablement le trouver en consultant le code source ici: http: // opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. Vous ne pouvez pas, car la fonction n'accepte pas un tel paramètre. Si vous souhaitez contrôler la compression, la méthode la plus simple à laquelle je puisse penser consiste tout d’abord à enregistrer votre image au format bitmap avec cvSaveImage () (ou un autre format sans perte de votre choix), puis à utiliser une autre bibliothèque d’images pour la convertir en JPEG de type. facteur de compression souhaité.
imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20});
  • filename.jpeg sera généré le nom du fichier
  • src être une image source lue contenant la variable
  • (vector<int>) conversion de type de fichier
  • {CV_IMWRITE_JPEG_QUALITY, 20} un tableau d'éléments à transmettre en tant que Param_ID - et Param_value dans la fonction imwrite
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top