OpenCV支持中文、日文、韩文等复杂字体的FreeType字体渲染引擎cv::freetype::FreeType2

发布于:2025-07-10 ⋅ 阅读:(12) ⋅ 点赞:(0)
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

封装了 FreeType 字体渲染引擎,用于在图像上绘制高质量的 UTF-8 编码文本,支持中文、日文、韩文等复杂语言字符,以及字体样式、大小、粗细等自定义设置。

公共成员函数 Public Member Functions

static Ptr<FreeType2> cv::freetype::createFreeType2()
  • 作用:创建一个 FreeType2 实例。
  • 返回值:返回 Ptr 智能指针对象。
  • 示例:
cv::Ptr<cv::freetype::FreeType2> ft2 = cv::freetype::createFreeType2();
virtual void loadFontData(const String& fontFileName, int idx) = 0;
  • 作用:加载指定字体文件(如 .ttf, .otf 等),并选择字体索引。
  • 参数:
    • fontFileName: 字体文件路径(UTF-8 或系统编码)。
    • idx: 字体索引(多字体文件中使用,通常为 0)。

示例:

   ft2->loadFontData("NotoSansCJK-Regular.ttc", 0);
 virtual void putText(InputOutputArray img, const String& text, Point org, int fontHeight, Scalar color, int thickness = -1, int line_type = 8, bool bottomLeftOrigin = false) = 0;
  • 作用:在图像上绘制 UTF-8 编码的文本。

  • 参数:

    • img: 输入输出图像(BGR 或 BGRA 格式)。
    • text: 要绘制的 UTF-8 字符串(支持中文、日文、阿拉伯语等)。
    • org: 文字左下角坐标(默认原点为左上角,可通过 bottomLeftOrigin 设置)。
    • fontHeight: 字体高度(像素单位)。
    • color: 文字颜色(BGR/RGBA)。
    • thickness: 文字粗细(负值表示填充)。
    • line_type: 抗锯齿类型(4、8、16)。
    • bottomLeftOrigin: 是否使用左下角为原点(类似 OpenGL 坐标系)。

    示例:

ft2->putText(img, "你好,世界!", Point(50, 100), 48, Scalar(0, 255, 0), -1, LINE_AA);
virtual void getAdvancingXs(const String& text, std::vector<int>& advancingXs) const = 0;
  • 作用:获取每个字符相对于前一个字符的横向偏移量(advance width)。
  • 参数:
    • text: UTF-8 字符串。
    • advancingXs: 输出每个字符的 X 方向偏移列表。
  • 用途:用于计算字符串排版宽度或实现自定义文字布局。
virtual Size getTextSize(const String& text, int fontHeight, int thickness) const = 0;
  • 作用:计算给定字体大小和粗细下的文本尺寸。

  • 参数:

    • text: UTF-8 字符串。
    • fontHeight: 字体高度。
    • thickness: 粗细。
  • 返回值:返回 Size(width, height),表示文本所占区域大小。

示例:

 Size textSize = ft2->getTextSize("测试文本", 36, 1);

示例代码

#include <opencv2/freetype.hpp>  // 必须启用 opencv_contrib 和 opencv_freetype 模块
#include <opencv2/opencv.hpp>

int main()
{
    // 创建空白图像
    cv::Mat img = cv::Mat::zeros( 300, 1000, CV_8UC3 );

    // 创建 FreeType 实例并加载字体
    cv::Ptr< cv::freetype::FreeType2 > ft2 = cv::freetype::createFreeType2();
    ft2->loadFontData( "AlibabaPuHuiTi-3-35-Thin.ttf", 0 );  // 确保字体文件存在

    // 绘制文本,✅ 注意这里是 8 个参数
    ft2->putText( img, "你好,世界!OpenCV FreeType 支持中文啦!", cv::Point( 20, 150 ), 48, cv::Scalar( 255, 255, 255 ), -1, cv::LINE_AA, false );

    // 显示结果
    cv::imshow( "Freetype Text", img );
    cv::waitKey( 0 );

    return 0;
}

运行结果

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到