Как преобразовать Mat в Bitmap с помощью OpenCVSharp?

Сначала я попробовал это,

    public static Bitmap MatToBitmap(Mat mat)
    {
        return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
    }

введите описание изображения здесь

Итак, я попробовал это,

    public static Bitmap MatToBitmap(Mat mat)
    {
        mat.ConvertTo(mat, MatType.CV_8U);
        return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
    }

Изображение полностью черное,

введите описание изображения здесь

    public static Bitmap ConvertMatToBitmap(Mat matToConvert) 
    {            
        return new Bitmap(matToConvert.Cols, matToConvert.Rows, 4*matToConvert.Rows, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, matToConvert.Data);
    }

Это тоже не работает.

введите описание изображения здесь


person user366312    schedule 31.05.2016    source источник


Ответы (3)


Вместо использования типа Mat я предлагаю вам использовать тип IplImage. Возьмите следующий пример кода в качестве справки (я использую VisualStudio2013 с OpenCvSharp2):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
using System.Drawing;

namespace TestOpenCVSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            // Read the Lenna image
            IplImage inputImage = new IplImage(@"Lenna.png");

            // Display the input image for visual inspection
            new CvWindow("original image", inputImage);
            Cv.WaitKey();

            // Convert into bitmap
            Bitmap bitimg = MatToBitmap(img);                
            // Save the bitmap
            bitimg.Save(@"bitmap.png");
        } // end of main function

        // This is the function that converts IplImage image
        // into Bitmap
        public static Bitmap MatToBitmap(IplImage image)
        {
            return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image);
        } // end of MatToBitmap function
    } // end of class definition
}  // end of namespace definition

Это ваше исходное изображение Ленны:

введите описание изображения здесь

А это bitmap.png, созданный из типа Bitmap:

введите описание изображения здесь

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

Обновление:

Используя OpenCVSharp3, следующий код также может преобразовать тип Mat в тип Bitmap:

Mat image = new Mat(@"Lenna.png");
Cv2.ImShow("image", image);
Cv2.WaitKey();

Bitmap bitimg = MatToBitmap(image);
// Save the bitmap
bitimg.Save(@"bitmap.png");

с функцией:

public static Bitmap MatToBitmap(Mat image)
{
   return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image);
} // end of MatToBitmap function

И полученный результат такой же, как показано выше.

person Derman    schedule 10.06.2016
comment
невозможно ли преобразовать мат в растровое изображение? - person user366312; 10.06.2016
comment
не могли бы вы предоставить свой код для создания коврика, чтобы я мог лучше оценить? - person Derman; 10.06.2016

mat имеет метод, который возвращает Bitmap:

        mat.ToBitmap(bitmap);

"используя OpenCvSharp.Extensions;" тоже для этого нужен.

person Mohammad Roshani    schedule 04.11.2016
comment
Да, вы можете это сделать, но вы не можете использовать растровое изображение после удаления мата. - person rism; 13.01.2018

Другие решения почти сработали для меня. Растровые изображения были там, но иногда возникало исключение, говорящее, что encoder было null.

Я решил, используя следующий код.

private static Bitmap MatToBitmap(Mat mat) {
    using (var ms = mat.ToMemoryStream()) {
        return (Bitmap) Image.FromStream(ms);
    }
}
person D.Kastier    schedule 20.04.2018
comment
Ни одно из других решений не работает с OpenCVSharp 4. - person Calabacin; 24.07.2020