- 操作系统: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;
}