2011-10-27 25 views
5

tôi lưu hình ảnh jpeg sử dụng sau C# EmguCV mã:EmguCV - cách chỉ định chất lượng jpeg khi lưu hình ảnh?

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

Nhưng hình ảnh được lưu trữ trong chất lượng extremally thấp (vuông 1 màu cho mỗi pixel 8x8).

Khi tôi lưu bmp tất cả đều ok:

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

Làm thế nào để nâng cao chất lượng jpeg khi sử dụng Emgu.Cv.Image.Save hay tôi nên gọi chức năng khác? Tại sao chất lượng mặc định lại quá thấp?

Đã cố gắng yêu cầu EmguCV forum nhưng không thể truy cập được.

+0

Hi, thay mặt EMGU Tôi xin lỗi vì trang web đang bị dẫn trước nhưng tôi luôn trolling đây và CodeProject cho bất kỳ câu hỏi mà tôi có thể giúp với. Chúc mừng – Chris

+0

@Chris Cảm ơn rất nhiều. Bây giờ tôi biết tôi có thể hỏi ai. Đề xuất công việc ổn định của trang web! – sergtk

Trả lời

8

EMGU chỉ có image.Save (tên tệp) do đó bạn phải sử dụng phương pháp .Net để lưu hình ảnh. Mã này có nguồn gốc từ here. Tôi tách mã để dễ dàng mã này sẽ mở một tập tin sau đó cố gắng để lưu nó. Đây là hàm bạn quan tâm trong saveJpeg (SaveFile.FileName, img.ToBitmap(), 100);. Dựa trên hàm saveJpeg (đường dẫn chuỗi, bitmap img, chất lượng dài).

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

Bây giờ để lấy mã cho hàm đó, bạn có thể sao chép và dán mã này vào dự án của mình, đừng quên câu lệnh đang sử dụng ở đầu mã của bạn.

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

Đây là phương pháp tốt nhất cho EMGU nếu bạn gặp khó khăn cho tôi biết.

Hope this helps,

Chris

+0

Có vẻ phù hợp với tôi. cảm ơn. Dù sao một cái gì đó kỳ lạ đã xảy ra với EmguCV - tại sao nó tiết kiệm jpeg với chất lượng quá thấp? Tôi không thể nhận ra. – sergtk

+0

Tôi không thể xác định chính xác nó không phải là lần đầu tiên tôi đã đi qua các chức năng tiết kiệm hình ảnh nghèo trong thực tế một số hệ thống MVS tốn kém sử dụng chất lượng nén tương tự. Tôi sẽ đưa ra vấn đề tuy nhiên nó có thể không làm cho nó thành một phiên bản mới như phương pháp này là khá cụ thể nền tảng. Vui mừng nó đã giúp mặc dù, Cheers – Chris

+0

Tôi đã tìm thấy làm thế nào để tái tạo hành vi rất lạ. Nếu ứng dụng chạy dưới VS2010 và thư mục bin chứa highgui210d.dll vấn đề xuất hiện, nếu tôi xóa highgui210d.dll tất cả các công trình tốt ... – sergtk

-1

Hãy thử điều này. Và tại sao bạn không sử dụng tài liệu OpenCV http://opencv.itseez.com cũ và tốt?

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

Xin lỗi, nhưng điều này là không thể với EMGU và tham chiếu OpenCV không áp dụng được. – Chris

4

Xây dựng về câu trả lời của Chris nếu có ai quan tâm ở đây là một gia hạn đơn giản;

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

Cách sử dụng;

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

Đây là cách tôi đã làm với Emgu CV:

CvInvoke.Imwrite(path, cvImage, new KeyValuePair<ImwriteFlags, int> (ImwriteFlags.JpegQuality, quality)); 
Các vấn đề liên quan