2011-10-27 18 views
5

Aşağıdaki C# EmguCV kodunu kullanarak jpeg görüntüsünü kaydediyorum:EmguCV - görüntü kaydederken jpeg kalitesini nasıl belirleyebiliriz?

Emgu.CV.Image<Gray, byte> image 
... 
image.Save("imageName.jpg"); 

Ancak resim aşırı düşük kalitede (8x8 piksel başına 1 renk kare) saklanır.

bmp kaydettiğimde tamam:

Emgu.CV.Image<Gray, byte> image 
... 
image.Save("imageName.bmp"); 

Emgu.Cv.Image.Save kullanırken jpeg kalitesini nasıl artırırım veya başka bir işlevi çağırmalıyım? Varsayılan kalite neden bu kadar düşük?

EmguCV forum konusunda soru sormaya çalışıyorum, ancak ulaşılamıyor.

+0

Hi, ben web sitesinin kapalı olduğu için özür dilerim EMGU adına ama ben her zaman yardımcı olabilecek herhangi bir soru için burada ve codeproject trolling ediyorum ile. Alkışlar – Chris

+0

@Chris Çok teşekkürler. Şimdi kime sorabileceğimi biliyorum. Sitenin kararlı çalışmasını öner! – sergtk

cevap

8

EMGU sadece bu nedenle görüntüyü kaydetme .Net yöntemi kullanmak zorunda Image.Save (dosya adı) sahiptir. Bu kod here'dan türetilmiştir. Kolaylıkla kodunu ayırdım, bu kod bir dosya açar ve kaydetmeye çalışır. Bu, saveJpeg (SaveFile.FileName, img.ToBitmap(), 100) ile ilgilenen işlevdir;. SaveJpeg (string path, Bitmap img, long quality) işlevine bağlı olarak. Bu fonksiyon gelen için

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

Şimdi kodu almak için bunu kopyalayıp kod üstündeki kullanarak ifade unutma projenize yapıştırabilirsiniz aşağıdaki.

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

Eğer takılıp kalırsanız, EMGU için en iyi yöntem budur. Bu yardımcı olur

Umut,

Chris

+0

Benim için uygun görünüyor. Teşekkürler. Neyse, EmguCV ile garip bir şey oldu - neden bu kadar düşük kalitede jpeg kaydediyor? Anlayamıyorum. – sergtk

+0

Tam olarak böyle kötü görüntü kaydetme işlevlerine rastladığım ilk kez değil, bazı pahalı MVS sistemleri aynı sıkıştırma kalitesini kullanır. Bu konuyu gündeme getireceğim, ancak bu yöntem daha ziyade platforma özel olduğundan, yeni bir sürüm haline gelmeyebilir. Yine de yardımcı oldu sevindim, Cheers – Chris

+0

Bu kadar garip davranışı nasıl yeniden üretebileceğimi buldum. Uygulama VS2010 altında çalıştırılırsa ve bin dizini highgui210d içerir.dll sorunu görünüyorsa, ben highgui210d.dll tüm işleri düzgün silerseniz ... – sergtk

-1

Bunu deneyin. Ve neden eski ve iyi OpenCV http://opencv.itseez.com belgesini kullanmıyorsunuz?

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

Üzgünüz, bu EMGU ile mümkün değildir ve OpenCV referansı geçerli değildir. – Chris

4
kimse burada ilgileniyor eğer Bina Chris'in Yanıta

basit uzantısı olduğu;

using System; 
using System.Linq; 
using System.Drawing.Imaging; 
using Emgu.CV.Structure; 

public static class EmguImageSave 
{ 
    /// <summary> 
    /// Save a jpeg image with a specified quality 
    /// </summary> 
    /// <param name="path">Name of the file to which to save the image</param> 
    /// <param name="quality">Byte that specifies JPEG Quality of the image encoder</param> 
    public static void Save(this Emgu.CV.Image<Bgr, Byte> 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); 
    } 
} 

Kullanım; İşte

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

Ben Emgu CV ile yapmıştım:

CvInvoke.Imwrite(path, cvImage, new KeyValuePair<ImwriteFlags, int> (ImwriteFlags.JpegQuality, quality)); 
İlgili konular