web-dev-qa-db-ja.com

OpenCVSharpを使用してマットをビットマップに変換するにはどうすればよいですか?

まず、これを試してみました、

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

enter image description here

それで、私はこれを試しました、

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

画像は完全に黒く、

enter image description here

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

これも機能しません。

enter image description here

7
user366312

Matタイプを使用する代わりに、IplImageタイプを使用することをお勧めします。次のサンプルコードを参照してください(私はOpenCvSharp2でVisualStudio2013を使用しています)。

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

これは入力レナ画像です:

enter image description here

そしてこれはbitmap.pngBitmapタイプから作成されます:

enter image description here

それが役に立てば幸い!

更新:

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

そして、得られた結果は上記と同じです。

10
Derman

matには、ビットマップを返すメソッドがあります。

        mat.ToBitmap(bitmap);

「OpenCvSharp.Extensionsを使用する;」これにも必要です。

2

他の解決策ほぼ私のために働いた。ビットマップはそこにありましたが、encodernullであるという例外がスローされることがありました。

次のコードを使用して解決しました。

private static Bitmap MatToBitmap(Mat mat) {
    using (var ms = mat.ToMemoryStream()) {
        return (Bitmap) Image.FromStream(ms);
    }
}
1
D.Kastier