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.

  1. Cos'è il fattore di compressione jpeg di cvSaveImage (...)
  2. Come posso passare il fattore di compressione quando uso cvSaveImage (...)
È stato utile?

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});
  1. Probabilmente puoi trovarlo cercando 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 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top