45-OpenCVSharp —-Cv2.PutText() 函数功能(绘制文本)详解

专栏地址:

《 OpenCV功能使用详解200篇 》

《 OpenCV算子使用详解300篇 》

《 Halcon算子使用详解300篇 》

内容持续更新 ,欢迎点击订阅


Cv2.PutText() 是 OpenCV 库中用来在图像上绘制文本的一个常用函数,它支持在图像的指定位置绘制给定内容的文字。这个函数在图像处理、计算机视觉和图形用户界面开发中非常常用。以下是对 Cv2.PutText() 的全面剖析。

1. 核心原理加核心公式(深入剖析)

Cv2.PutText() 的核心原理是将文本的每个字符逐一绘制到图像的指定位置。具体来说,这个过程包括:

  • 字体选择:OpenCV 使用的是一种基于向量的字体系统,字体通常由轮廓构成,每个字符是一个封闭的路径。文本的字符大小、粗细、颜色和类型等都是由函数的参数来控制的。
  • 文本渲染:文本绘制本质上是根据给定的字体和大小,在图像上逐个字符地进行像素填充。每个字符的边缘通常是通过抗锯齿技术进行平滑的,从而使文本看起来更加平滑。

在数学上,绘制文本的公式可以简化为:
Text(x, y) = F(font, size, color, position, angle)
其中:

  • x, y 是文本的起始位置(左下角)。
  • F 是所选字体的参数函数,决定了字符的外观。
  • size 是字体大小。
  • color 是文本的颜色。
  • position 是文本在图像中的位置。
  • angle 是文本的旋转角度。

2. 功能详解

Cv2.PutText() 提供了一种简便的方式来在图像中渲染文本,常用于以下几种情况:

  • 在图像上标注说明,常见于实时视频处理或图像分析。
  • 在图像上动态展示文字信息,如时间、日期或分析结果。
  • 为图像添加标签、标题或其他说明文字,常用于视觉化展示。

3. 参数详解(深入剖析)

Cv2.PutText() 函数的常见参数如下:

Cv2.PutText(Mat img, string text, Point org, HersheyFonts fontFace, double fontScale, Scalar color, int thickness = 1, LineTypes lineType = LineTypes.Link8, bool bottomLeftOrigin = false);
  1. Mat img

    • 类型:Mat
    • 描述:目标图像对象,文本将被绘制到该图像上。
    • 注意:文本会直接修改传入的 Mat 对象。
  2. string text

    • 类型:string
    • 描述:要绘制的文本内容。可以是任何字符串,支持 Unicode 字符。
  3. Point org

    • 类型:Point
    • 描述:文本左下角的起始坐标。Point(x, y) 指定文本的左下角位置,图像坐标系统的原点通常位于左上角。
    • 注意:文本的位置基于这个点。
  4. HersheyFonts fontFace

    • 类型:HersheyFonts(枚举类型)
    • 描述:指定字体类型。OpenCV 提供了几种字体选项,如:
      • FONT_HERSHEY_SIMPLEX:简单无衬线字体。
      • FONT_HERSHEY_PLAIN:细小字体。
      • FONT_HERSHEY_DUPLEX:稍微复杂的字体。
      • FONT_HERSHEY_COMPLEX:更为复杂的字体,适合渲染高质量文本。
      • FONT_HERSHEY_TRIPLEX:有衬线的复杂字体。
      • FONT_HERSHEY_SCRIPT_SIMPLEX:草书风格的字体。
  5. double fontScale

    • 类型:double
    • 描述:字体的缩放因子,决定了字体的大小。fontScale = 1 时是默认大小。
  6. Scalar color

    • 类型:Scalar
    • 描述:字体的颜色,通常是 BGR 格式的颜色。例如,Scalar(255, 0, 0) 代表红色。
    • 注意:支持透明度,如果需要半透明文本,可以通过使用带 alpha 通道的颜色。
  7. int thickness

    • 类型:int
    • 描述:文本线条的粗细,默认为 1。
    • 注意:较大的值可以产生更粗的文本。
  8. LineTypes lineType

    • 类型:LineTypes(枚举类型)
    • 描述:线条类型,常见的是:
      • LineTypes.Link8:8邻域连接。
      • LineTypes.AntiAlias:抗锯齿线条,适用于较高质量文本。
  9. bool bottomLeftOrigin

    • 类型:bool
    • 描述:指定坐标系统的起点是否为图像的左下角。默认为 false,即原点位于图像的左上角。设置为 true 时,文本的起始点变为左下角。

4. 使用场景分析

  • 视频流实时标注:在实时视频流上添加帧号、时间戳、检测结果等文本信息。
  • 图像分析:在处理后的图像上添加描述、标签、测量值等信息,方便展示和分析。
  • 图形用户界面(GUI):在图形化界面中添加按钮提示、状态信息等。
  • 可视化展示:展示图像处理结果时,在图像上叠加文本进行详细注解。

5. 使用注意事项分析

  • 字体选择与大小:不同字体的渲染效果和大小有所差异,应根据需要选择适合的字体。若文本过长,可以考虑调整字体大小或分行。
  • 文本位置:要确保文本不超出图像边界,尤其是在动态场景下,文本的位置可能需要动态调整。
  • 性能:在处理大量图像时,每次调用 Cv2.PutText() 都会在图像上进行绘制,可能会影响性能,特别是高分辨率的图像和复杂的文本。

6. 运行时间优化方法

  • 避免重复绘制:如果需要在多个帧或多个区域上绘制相同的文本,考虑将文本绘制操作集中处理,而不是每次都调用 PutText()
  • 简化字体:在性能要求较高的场景中,选择简单的字体类型(如 FONT_HERSHEY_SIMPLEX)可以减少渲染复杂度。
  • 减少绘制区域:如果只需要在图像的某些区域绘制文本,可以在每次绘制前先裁剪图像区域,避免无效的计算。

7. 优缺点

优点:
  • 简易性:函数使用简单,易于在图像上添加文本信息。
  • 高灵活性:支持多种字体、颜色、大小、粗细等参数设置,满足不同的需求。
  • 兼容性好:可以与其他 OpenCV 图像处理函数结合使用,灵活性高。
缺点:
  • 性能问题:在实时视频流或高分辨率图像上,频繁调用 Cv2.PutText() 可能会导致性能瓶颈。
  • 字体选择有限:尽管支持多种字体,但相比专业的图形渲染库,OpenCV 提供的字体选择较为简单。

8. 实际案例

using OpenCvSharp;

var image = new Mat(400, 400, MatType.CV_8UC3, new Scalar(255, 255, 255));
string text = "OpenCV Text Example";
Point org = new Point(50, 200);
Cv2.PutText(image, text, org, HersheyFonts.FONT_HERSHEY_SIMPLEX, 1, new Scalar(0, 0, 0), 2, LineTypes.Link8);
Cv2.ImShow("Text Image", image);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();

9. 案例分析

在上面的例子中,我们创建了一个白色背景的 400x400 图像,并使用 Cv2.PutText() 绘制了 “OpenCV Text Example” 文本。文本的起始位置为 (50, 200),字体为 FONT_HERSHEY_SIMPLEX,字体大小为 1,颜色为黑色,线条粗细为 2。此代码会显示文本的效果并弹出一个窗口展示。

10. 结合其他相关算法搭配使用情况

Cv2.PutText() 常常与其他图像处理算法结合使用,增强图像展示或结果注释的效果。以下是一些常见的组合使用场景:

  • 与边缘检测结合
    在进行边缘检测(如 Canny)后,我们常常希望在图像上标注重要信息或特征位置。此时,可以通过 Cv2.PutText() 在边缘图上添加相关描述,比如 “Edge Detected” 或标记检测到的边缘线。

    using OpenCvSharp;
    
    var image = Cv2.ImRead("image.jpg");
    var edges = new Mat();
    Cv2.Canny(image, edges, 100, 200);  // Canny 边缘检测
    
    // 在边缘图上添加文本
    string text = "Edge Detected";
    Point org = new Point(30, 30);
    Cv2.PutText(edges, text, org, HersheyFonts.FONT_HERSHEY_SIMPLEX, 1, new Scalar(0, 0, 255), 2, LineTypes.Link8);
    
    Cv2.ImShow("Edges with Text", edges);
    Cv2.WaitKey(0);
    Cv2.DestroyAllWindows();
    
  • 与轮廓检测结合
    轮廓检测通常用于对象检测,在检测到轮廓后,常常会在图像上添加文本,标注该对象的类别或相关信息。Cv2.PutText() 可以用来显示轮廓的数量、位置、尺寸等信息。

    using OpenCvSharp;
    
    var image = Cv2.ImRead("image.jpg", ImreadModes.Grayscale);
    var contours = new Mat();
    var hierarchy = new Mat();
    
    // 找到轮廓
    Cv2.FindContours(image, contours, hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
    
    // 绘制轮廓并添加文本
    string text = $"Contours found: {contours.Rows}";
    Point org = new Point(50, 50);
    Cv2.PutText(image, text, org, HersheyFonts.FONT_HERSHEY_SIMPLEX, 1, new Scalar(255, 0, 0), 2);
    
    Cv2.ImShow("Contours with Text", image);
    Cv2.WaitKey(0);
    Cv2.DestroyAllWindows();
    
  • 与目标检测结合
    在目标检测算法(例如基于深度学习的检测框架,如 YOLO 或 SSD)中,Cv2.PutText() 可以用来标记检测到的物体类别以及置信度分数。例如,绘制边界框并在其上方显示物体类别和置信度。

    using OpenCvSharp;
    
    // 假设我们有一个检测到的边界框和分类信息
    Rect box = new Rect(100, 100, 150, 150);
    string label = "Cat";
    double confidence = 0.87;
    
    Mat image = Cv2.ImRead("image.jpg");
    
    // 绘制边界框
    Cv2.Rectangle(image, box, new Scalar(0, 255, 0), 2);
    
    // 在边界框上方添加文本
    string text = $"{label}: {confidence * 100}%";
    Point org = new Point(box.X, box.Y - 10);  // 文本位置在框的上方
    Cv2.PutText(image, text, org, HersheyFonts.FONT_HERSHEY_SIMPLEX, 0.8, new Scalar(255, 0, 0), 2);
    
    Cv2.ImShow("Detection Result", image);
    Cv2.WaitKey(0);
    Cv2.DestroyAllWindows();
    
  • 与图像合成(叠加图像)结合
    在图像合成中,将多个图像叠加在一起时,Cv2.PutText() 可以用于在合成图像的不同区域添加文本注解。例如,在创建图像拼接或拼图时,标注每个图像的来源、内容或日期。

11. 相似算法

虽然 Cv2.PutText() 是一个非常方便的文本绘制工具,但在某些情况下,我们可能需要使用其他方法来实现更加复杂或定制化的文本效果。以下是一些与 Cv2.PutText() 功能类似,或者能够提供更高自由度的相似算法和方法:

  1. Pillow(PIL)库中的 ImageDraw.text()
    Pillow 是一个常用于 Python 中的图像处理库,它提供了类似的文本绘制功能。ImageDraw.text() 能够在图像上绘制文字,并且支持更多的字体和样式定制。适用于 Python 用户,特别是在需要更复杂的文本渲染和字体支持时。

    from PIL import Image, ImageDraw, ImageFont
    
    # 创建一个空白图像
    image = Image.new('RGB', (400, 400), color='white')
    draw = ImageDraw.Draw(image)
    
    # 加载字体
    font = ImageFont.truetype("arial.ttf", size=36)
    
    # 绘制文本
    text = "Hello, OpenCV!"
    draw.text((50, 150), text, font=font, fill="black")
    
    image.show()
    
  2. Direct2D(Windows)
    在 Windows 平台上,如果你使用 C++ 开发图形应用,Direct2D 是一个强大的图形API,能够在图形内容中渲染文本。与 OpenCV 不同,Direct2D 提供了更高效、功能更强大的文本渲染,支持更多字体、排版和效果,如文本阴影、渐变等。

  3. Cairo Graphics
    Cairo 是一个跨平台的 2D 图形库,支持多种输出格式(包括 PDF、SVG 和图像)。Cairo 也支持高级文本渲染,如字符对齐、路径布局和文本阴影等,适合需要复杂文本处理的场景。

  4. Qt 图形框架
    Qt 提供了丰富的 GUI 和图形功能,在其中的 QPainter 类中,也可以用来绘制文本。它支持文本格式化、字体样式、对齐方式以及字体路径等,比 OpenCV 更适合需要图形界面的应用程序。

总结

Cv2.PutText() 是 OpenCV 中非常实用的文本绘制函数,能够快速地将文本信息叠加到图像上,广泛应用于计算机视觉、图像处理和图形用户界面(GUI)开发中。它具有简单的接口,支持多种字体、大小、颜色、粗细等设置,并且能够在各种图像处理算法中与其他功能组合使用,如边缘检测、目标检测、轮廓绘制等。

尽管它在许多场合都非常方便,但在处理高分辨率图像、大量文本或需要更复杂文本效果的场合,可能需要考虑其他文本渲染库(如 Pillow 或 Direct2D)来实现更精细的效果。

希望这篇分析对你了解 Cv2.PutText() 和相关图像文本绘制技术有所帮助!


专栏地址:

《 OpenCV功能使用详解200篇 》

《 OpenCV算子使用详解300篇 》

《 Halcon算子使用详解300篇 》

内容持续更新 ,欢迎点击订阅


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

观视界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值