如何使用 OpenCVSharp 将 Mat 转换为 Bitmap?
How can I convert Mat to Bitmap using 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);
}
这也不行。
我建议您不要使用 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
这是您输入的 Lenna 图像:
这是从 Bitmap
类型创建的 bitmap.png
:
希望对您有所帮助!
更新:
通过使用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
得到的结果与上图相同。
mat 有一个方法 return Bitmap:
mat.ToBitmap(bitmap);
为此还需要"using OpenCvSharp.Extensions;"。
其他解决方案几乎对我有用。
位图在那里,但有时会抛出 encoder
是 null
的异常。
我用下面的代码解决了。
private static Bitmap MatToBitmap(Mat mat) {
using (var ms = mat.ToMemoryStream()) {
return (Bitmap) Image.FromStream(ms);
}
}
首先,我尝试了这个,
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);
}
这也不行。
我建议您不要使用 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
这是您输入的 Lenna 图像:
这是从 Bitmap
类型创建的 bitmap.png
:
希望对您有所帮助!
更新:
通过使用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
得到的结果与上图相同。
mat 有一个方法 return Bitmap:
mat.ToBitmap(bitmap);
为此还需要"using OpenCvSharp.Extensions;"。
其他解决方案几乎对我有用。
位图在那里,但有时会抛出 encoder
是 null
的异常。
我用下面的代码解决了。
private static Bitmap MatToBitmap(Mat mat) {
using (var ms = mat.ToMemoryStream()) {
return (Bitmap) Image.FromStream(ms);
}
}