Frage

Ich bin mit OpenCV und Speicher als JPEG der cvSaveImage Funktion, aber ich bin nicht in der Lage den JPEG-Komprimierungsfaktor von diesem verwendet zu finden.

  1. Was ist cvSaveImage (...) 's Jpeg Compression Faktor
  2. Wie kann ich den Kompressionsfaktor passieren, wenn cvSaveImage mit (...)
War es hilfreich?

Lösung

Zur Zeit cvSaveImage () deklariert nur zwei Parameter zu übernehmen:

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

Doch der " neueste getestet Snapshot " hat :

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

Ich habe nicht in der Lage gewesen, eine Dokumentation zu finden, aber mein Eindruck durch diesen Code von Stossen ist, dass Sie ein Array von int-Werten aufbauen würden im dritten Parameter zu übergeben:

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

Ich weiß nicht, wie der Qualitätswert codiert wird, und ich habe nie versucht, diese, so caveat emptor.

Edit:

Als ein bisschen neugierig auf das, ich heruntergeladen und gebaut, um die neueste Version Stamm von OpenCV, und konnte die oben über dieses Bit von Wegwerf-Code bestätigen:

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

Mein "test.jpg" war 2054 KB, die erstellt "out1.jpg" war 182 KB und "out2.jpg" wurde 4009 KB.

Sieht aus wie Sie in guter Form sein sollten unter der Annahme, können Sie den neuesten Code aus der Subversion-Repository verwenden.

BTW, ist der Bereich für die Qualitätsparameter 0-100, Standard ist 95.

Andere Tipps

OpenCV jetzt hat einen Parameter jpeg Qualität zu setzen. Ich bin nicht sicher, wann genau diese eingeführt wurde, aber vermutlich einige Zeit nach 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);

Wenn Sie C ++ 0x verwenden, können Sie diese kürzere Schreibweise verwenden:

imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY});
  1. Sie können wahrscheinlich diese hier in den Quellcode von Stossen finden: http: // opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. Sie können nicht, da die Funktion nicht solch einen Parameter akzeptiert. Wenn Sie die einfachste Methode steuern möchten die Kompression dann kann ich mir vorstellen wird Ihr Bild als Bitmap mit cvSaveImage ersten Speichern () (oder einem anderen lossless Format Ihrer Wahl) und dann ein anderes Bild-Bibliothek verwenden, um ein JPEG von der zu konvertieren gewünschter Kompressionsfaktor.
imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20});
  • filename.jpeg werden ausgegeben Dateiname
  • src Quellbild gelesen werden, die variable
  • (vector<int>) typecasting
  • {CV_IMWRITE_JPEG_QUALITY, 20} ein Array von Elementen als Param_ID übergeben werden - und PARAM_VALUE in imwrite Funktion
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top