2011-10-27 13 views
5

मैं निम्नलिखित सी # EmguCV कोड का उपयोग कर jpeg छवि को बचाने:EmguCV - छवि सहेजते समय जेपीजी गुणवत्ता निर्दिष्ट कैसे करें?

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

लेकिन छवि extremally कम गुणवत्ता (8x8 पिक्सेल प्रति 1 रंग वर्ग) में संग्रहित है।

जब मैं bmp बचाने सब ठीक कर रहे हैं:

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

कैसे jpeg गुणवत्ता को बढ़ाने के लिए जब Emgu.Cv.Image.Save का उपयोग कर या मैं अन्य समारोह बुलाना चाहिए? डिफ़ॉल्ट गुणवत्ता इतनी कम क्यों है?

EmguCV forum पर पूछने का प्रयास किया, लेकिन यह पहुंच योग्य नहीं है।

+0

हाय, मैं वेबसाइट नीचे होने के लिए माफी माँगता हूँ EMGU की ओर से लेकिन मैं हमेशा यहाँ और codeproject कोई प्रश्न है कि मैं मदद कर सकता है के लिए trolling कर रहा हूँ साथ में। चीयर्स – Chris

+0

@ क्रिस धन्यवाद बहुत कुछ। अब मुझे पता है कि मैं किससे पूछ सकता हूं। साइट के स्थिर काम का सुझाव दें! – sergtk

उत्तर

8

ईएमजीई में केवल छवि है। सहेजें (फ़ाइल नाम) इसलिए आपको छवि को सहेजने के .Net विधि का उपयोग करना होगा। यह कोड here से लिया गया है। मैंने कोड को आसानी से अलग करने के लिए कोड को खोल दिया है, फिर इसे सहेजने का प्रयास करता है। यह वह कार्य है जिसमें आप रुचि रखते हैं saveJpeg (SaveFile.FileName, img.ToBitmap(), 100);। फ़ंक्शन सेवजेपेग (स्ट्रिंग पथ, बिटमैप आईएमजी, लंबी गुणवत्ता) के आधार पर।

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

अब कोड है कि समारोह के लिए से आता है प्राप्त करने के लिए निम्नलिखित आप कॉपी और इसे अपने प्रोजेक्ट में पेस्ट अपने कोड के शीर्ष पर कथन का उपयोग मत भूलना कर सकते हैं।

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

यह EMGU लिए सबसे अच्छा तरीका है, तो आप अटक जाते हैं मुझे पता है है।

आशा इस मदद करता है,

क्रिस

+0

मेरे लिए उपयुक्त लगता है। धन्यवाद। वैसे भी EmguCV के साथ कुछ अजीब हुआ - यह इतनी कम गुणवत्ता वाले जेपीजी क्यों बचाता है? मुझे एहसास नहीं हो सकता – sergtk

+0

मैं बिल्कुल निर्दिष्ट नहीं कर सकता कि यह पहली बार नहीं है कि मैं इस तरह के खराब छवि बचत कार्यों में आया हूं, वास्तव में कुछ महंगा एमवीएस सिस्टम एक ही संपीड़न गुणवत्ता का उपयोग करते हैं। मैं इस मामले को सामने लाऊंगा हालांकि यह इसे एक नई रिलीज में नहीं ला सकता है क्योंकि यह विधि बल्कि मंच विशिष्ट है। खुशी है कि यह मदद की, चीयर्स – Chris

+0

मुझे पता चला है कि कैसे अजीब व्यवहार को पुन: पेश किया जाए। यदि आवेदन VS2010 के तहत चलाया जाता है और बिन निर्देशिका में highgui210d होता है।dll समस्या प्रकट होती है, अगर मैं highgui210d.dll हटा देता हूं तो सब ठीक काम करता है ... – sergtk

-1

इसे आजमाएं। और आप पुराने और अच्छे ओपनसीवी http://opencv.itseez.com दस्तावेज़ का उपयोग क्यों नहीं करते?

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

क्षमा करें, लेकिन यह EMGU के साथ संभव नहीं है और ओपनसीवी संदर्भ लागू नहीं है। – Chris

4

अगर कोई यहाँ रुचि रखता है क्रिस जवाब पर बिल्डिंग एक सरल विस्तार है,

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

उपयोग;

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

यहां बताया गया है मैं Emgu सीवी के साथ किया था:

CvInvoke.Imwrite(path, cvImage, new KeyValuePair<ImwriteFlags, int> (ImwriteFlags.JpegQuality, quality)); 
संबंधित मुद्दे