EmguCV - как указать качество jpeg при сохранении изображения? - PullRequest
5 голосов
/ 27 октября 2011

Я сохраняю изображение в формате JPEG, используя следующий код C # EmguCV :

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

Но изображение сохраняется в чрезвычайно низком качестве (1 цветной квадрат на 8x8 пикселей).

Когда я сохраняю bmp, все в порядке:

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

Как повысить качество JPEG при использовании Emgu.Cv.Image.Save или мне следует вызвать другую функцию? Почему качество по умолчанию такое низкое?

Пытался спросить на форуме EmguCV , но он недоступен.

Ответы [ 4 ]

8 голосов
/ 27 октября 2011

EMGU имеет только image.Save (имя файла), поэтому вы должны использовать .Net метод сохранения изображения.Этот код получен из здесь .Я разделил код для простоты, этот код открывает файл и пытается сохранить его.Это интересующая вас функция saveJpeg (SaveFile.FileName, img.ToBitmap (), 100); .Основываясь на функции saveJpeg (путь строки, растровое изображение, длинное качество).

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 в верхней части вашего кода.

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, если вы застряли, дайте мне знать.

Надеюсь, это поможет,

Chris

4 голосов
/ 06 июля 2012

Основываясь на ответе Криса, если кому-то интересно, это простое расширение;

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; }
}
1 голос
/ 03 сентября 2017

Вот как я поступил с Эмгу CV:

CvInvoke.Imwrite(path, cvImage, new KeyValuePair<ImwriteFlags, int> (ImwriteFlags.JpegQuality, quality));
0 голосов
/ 27 октября 2011

Попробуй это. И почему бы вам не использовать старый и хороший OpenCV http://opencv.itseez.com doc?

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