EmguCV – come specificare la qualità jpeg quando si salva l’immagine?

Salvo l’immagine jpeg usando il seguente codice C # EmguCV :

Emgu.CV.Image image ... image.Save("imageName.jpg"); 

Ma l’immagine è archiviata in una qualità estremamente bassa (1 quadrato di colore per 8×8 pixel).

Quando salgo bmp, tutto ok:

 Emgu.CV.Image image ... image.Save("imageName.bmp"); 

Come aumentare la qualità jpeg quando si usa Emgu.Cv.Image.Save o si deve chiamare un’altra funzione? Perché la qualità di default è così bassa?

Ho cercato di chiedere sul forum EmguCV , ma è irraggiungibile.

EMGU ha solo image.Save (nome file) quindi devi usare il metodo .Net per salvare l’immagine. Questo codice è derivato da qui . Ho separato il codice per facilitare questo codice apre un file quindi tenta di salvarlo. Questa è la funzione che ti interessa in saveJpeg (SaveFile.FileName, img.ToBitmap (), 100); . Basato sulla funzione saveJpeg (percorso stringa, img Bitmap, qualità lunga).

 open.Filter = "Image Files (*.tif; *.dcm; *.jpg; *.jpeg; *.bmp)|*.tif; *.dcm; *.jpg; *.jpeg; *.bmp"; if (open.ShowDialog() == DialogResult.OK) { Image img = new Image(open.FileName); SaveFileDialog SaveFile = new SaveFileDialog(); if (SaveFile.ShowDialog() == DialogResult.OK) { saveJpeg(SaveFile.FileName, img.ToBitmap(), 100); } } 

Ora per ottenere il codice per quella funzione viene dai seguenti è ansible copiare e incollare questo nel progetto non dimenticare l’istruzione using nella parte superiore del codice.

 using System.Drawing.Imaging; private void saveJpeg(string path, Bitmap img, long quality) { // Encoder parameter for image quality EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); // Jpeg image codec ImageCodecInfo jpegCodec = this.getEncoderInfo("image/jpeg"); if (jpegCodec == null) return; EncoderParameters encoderParams = new EncoderParameters(1); encoderParams.Param[0] = qualityParam; img.Save(path, jpegCodec, encoderParams); } private ImageCodecInfo getEncoderInfo(string mimeType) { // Get image codecs for all image formats ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); // Find the correct image codec for (int i = 0; i < codecs.Length; i++) if (codecs[i].MimeType == mimeType) return codecs[i]; return null; } 

Questo è il metodo migliore per EMGU se ti blocchi, fammi sapere.

Spero che questo ti aiuti,

Chris

Basarsi sulla risposta di Chris se qualcuno è interessato qui è una semplice estensione;

 using System; using System.Linq; using System.Drawing.Imaging; using Emgu.CV.Structure; public static class EmguImageSave { ///  /// Save a jpeg image with a specified quality ///  /// Name of the file to which to save the image /// Byte that specifies JPEG Quality of the image encoder public static void Save( this Emgu.CV.Image img, string filename, double quality ) { var encoderParams = new EncoderParameters( 1 ); encoderParams.Param[0] = new EncoderParameter( System.Drawing.Imaging.Encoder.Quality, (long)quality ); var jpegCodec = (from codec in ImageCodecInfo.GetImageEncoders() where codec.MimeType == "image/jpeg" select codec).Single(); img.Bitmap.Save( filename, jpegCodec, encoderParams ); } } 

Uso;

 var fname = 0; while( true ) { try { var img = capture.QueryFrame(); img.Save( String.Format( @"c:\rec\{0}.jpg", ++fname), 100 ); } catch( Exception ) { break; } } 

Ecco come ho fatto con Emgu CV:

 CvInvoke.Imwrite(path, cvImage, new KeyValuePair (ImwriteFlags.JpegQuality, quality)); 

Prova questo. E perché non usi il vecchio e buono documento OpenCV http://opencv.itseez.com ?

 int quality = 100; // 0 - low, 100 - best image.Save("imageName.bmp", CV_IMWRITE_JPEG_QUALITY, quality);