opencvShrap的PutText函数输出中文
PutText函数不支持中文的输出,所以需要将Mat类型转换成Image类型,然后调用Graphics的DrawString方法来写中文内容,然后再将这个Image类型转回Mat类型,并覆盖原来的Mat,思路还是很简单的。下面是完整代码:
public static void PutText(this Mat mat, string content, System.Drawing.Point location,
Color color, float fontSzie = 10, string familyName = "宋体")
{
var tempImg = mat.ToImage();
tempImg.DrawString(content, location, color, fontSzie, familyName);
var tempMat = tempImg.ToMat();
tempMat.CopyTo(mat);
tempMat.Dispose();
}
public static Image ToImage(this Mat src)
{
if(src == null || src.Empty())
return null;
return Image.FromStream(src.ToMemoryStream());
}
public static Mat ToMat(this Image image)
{
return image == null ? null : Cv2.ImDecode(image.ToBinary(), ImreadModes.Color);
}
public static byte[] ToBinary(this Image image)
{
if(image == null)
return new byte[0];
using(MemoryStream stream = new MemoryStream())
{
image.Save(stream, ImageFormat.Bmp);
BinaryReader reader = new BinaryReader(stream);
return stream.ToArray();
}
}
public static void DrawString(this Image image, string content, System.Drawing.Point location,
Color color, float fontSzie = 10, string familyName = "宋体")
{
using (Graphics g = Graphics.FromImage(image))
{
Font font = new Font(familyName, fontSzie, FontStyle.Bold);
g.DrawString(content, font, new SolidBrush(color), location);
}
}