C# Cv2.PutText
时间: 2025-06-30 19:10:37 浏览: 14
### 在 C# 中使用 OpenCV 的 `Cv2.PutText` 方法
OpenCV 提供了 `Cv2.PutText` 方法,用于在图像上绘制文本。该方法支持多种字体样式和参数配置,能够满足大多数图像标注需求。以下是一个标准的调用示例:
```csharp
using OpenCvSharp;
// 读取图像
Mat img = Cv2.ImRead("test.jpg");
// 检查图像是否成功加载
if (img.Empty())
{
Console.WriteLine("无法加载图像");
return;
}
// 绘制英文文本
string text = "Sample Text";
Point org = new Point(10, 30);
HersheyFonts fontFace = HersheyFonts.HersheyComplex;
double fontScale = 1.0;
Scalar color = new Scalar(0, 255, 0); // 绿色
int thickness = 2;
Cv2.PutText(img, text, org, fontFace, fontScale, color, thickness);
// 显示图像
Cv2.ImShow("Text Output", img);
Cv2.WaitKey(0);
```
上述代码展示了如何使用内置字体在图像上绘制文本,并设置了字体大小、颜色和粗细等参数。
---
### `PutText` 方法的参数说明
- **`img`**:目标图像矩阵(`Mat` 类型),必须是 8 位单通道或三通道图像。
- **`text`**:要绘制的文本内容,字符串类型。
- **`org`**:文本起始位置坐标,通常为 `Point` 类型。
- **`fontFace`**:字体类型,可选值包括 `HersheyFonts.HersheySimplex`、`HersheyFonts.HersheyPlain`、`HersheyFonts.HersheyDuplex`、`HersheyFonts.HersheyComplex` 等。
- **`fontScale`**:字体缩放比例,浮点数类型。
- **`color`**:文本颜色,使用 `Scalar` 表示 BGR 颜色值。
- **`thickness`**:线条粗细,整数类型。
- **`lineType`**:线条类型,默认为 8 连通线,也可指定抗锯齿线(`LineTypes.AntiAlias`)[^4]。
---
### 处理中文字符显示问题
OpenCV 内置的 `PutText` 方法不支持直接绘制中文字符。如果尝试绘制中文文本,通常会显示为乱码或方框符号。为了解决这一限制,可以借助第三方库如 FreeType 或使用图像处理技术将中文字符转换为图像后叠加到原图中。
一种常见的解决方案是结合 .NET 图像处理库(如 GDI+)来渲染中文文本,并将其绘制到 OpenCV 图像上。例如,可以先创建一个透明背景的位图,使用 `Graphics.DrawString()` 方法绘制中文文本,再将其转换为 OpenCV 可识别的格式并叠加到原始图像上。
此外,也可以通过封装 PIL 和 FreeType 字体渲染功能实现类似效果,类似于 Python 中的 `cv2AddChineseText` 函数实现方式[^2]。
---
### 示例:手动处理换行符
由于 `PutText` 不支持 `\n` 换行符,因此需要手动拆分字符串并逐行绘制文本。以下是实现方式:
```csharp
string[] lines = "Line 1\nLine 2".Split('\n');
int y = 60;
foreach (var line in lines)
{
Cv2.PutText(img, line, new Point(10, y), HersheyFonts.HersheyComplex, 1.0, new Scalar(0, 255, 0), 2);
y += 30;
}
```
此方法确保多行文本可以在不同位置正确绘制,避免因换行符导致的异常显示问题[^4]。
---
### 注意事项
- 确保传递给 `Cv2.PutText` 的 `org` 参数为有效的 `Point` 对象,否则可能引发运行时错误[^5]。
- 避免在文本字符串中直接使用不可见字符,应采用手动处理方式以确保兼容性。
- 如需显示中文字符,建议集成 GDI+ 或使用图像合成技术进行动态渲染[^2]。
---
阅读全文
相关推荐

















