如安在OpenCV中实现中文绘制?

[复制链接]
发表于 2025-10-20 20:05:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、功能实现思绪分析

1.1 OpenCV原生文本绘制缺陷

OpenCV内置的cv::putText()函数仅支持ASCII字符集渲染,其底层实现基于Hershey矢量字体库,未包罗中笔墨形数据。该函数在处理惩罚多字节编码时会主动过滤非ASCII字符,导致中文体现为乱码或空缺地域。
1.2 FreeType办理方案原理

FreeType作为开源字体引擎,提供跨平台字体渲染本事。其焦点上风在于:

  • 支持TrueType、OpenType等主流字体格式
  • 可剖析字体文件的字形表面数据
  • 提供抗锯齿渲染功能
  • 兼容Unicode字符编码
通过集成FreeType到OpenCV项目,可实现以下技能蹊径:

  • 初始化FreeType字体引擎
  • 加载中笔墨体文件(如.ttf)
  • 剖析汉字Unicode编码
  • 天生位图字形数据
  • 将位图叠加到目标图像
1.3 技能选型对比

方法长处缺点预渲染图片叠加法实现简单无法动态修改文本内容CvxText封装类代码复用性高需自行维护第三方类库OpenCV+FreeType2 API官方支持、兼容性好需OpenCV 3.0+版本支持本文选用OpenCV内置的freetype模块,该模块自OpenCV 3.0起提供对FreeType的官方封装。

二、情况设置与依赖安装

2.1 开发情况要求


  • OpenCV 3.4.0及以上版本(需包罗freetype模块)
  • FreeType 2.6.0+开发库
  • C++11编译器(GCC/MSVC等)
2.2 体系级依赖安装
  1. # Ubuntu/Debian
  2. sudo apt-get install libopencv-dev libfreetype6-dev
  3. # CentOS/RHEL
  4. sudo yum install opencv-devel freetype-devel
复制代码
2.3 CMake项目设置
  1. cmake_minimum_required(VERSION 3.12)
  2. project(OpenCV_Chinese_Demo)
  3. set(CMAKE_CXX_STANDARD 11)
  4. find_package(OpenCV REQUIRED)
  5. find_package(Freetype REQUIRED)
  6. add_executable(main main.cpp)
  7. target_link_libraries(main ${OpenCV_LIBS} ${FREETYPE_LIBRARIES})
复制代码
三、焦点实现流程

3.1 实现流程图

3.2 关键步调分解

步调1:字体引擎初始化
  1. #include <opencv2/freetype.hpp>
  2. auto ft2 = cv::freetype::createFreeType2();
  3. ft2->loadFontData("msyh.ttf", 0); // 加载微软雅黑字体
复制代码
步调2:文本布局盘算
  1. int baseline = 0;
  2. cv::Size textSize = ft2->getTextSize(
  3.     text,             // 输入字符串
  4.     fontHeight,       // 字体高度
  5.     cv::FILLED,       // 线型样式
  6.     &baseline         // 基线偏移量
  7. );
复制代码
步调3:抗锯齿渲染
  1. ft2->putText(
  2.     image,            // 目标图像矩阵
  3.     text,             // UTF-8编码文本
  4.     origin,           // 绘制起点坐标
  5.     fontHeight,       // 字体像素高度
  6.     color,            // 颜色(Scalar对象)
  7.     thickness,        // 线宽
  8.     cv::LINE_AA,      // 抗锯齿模式
  9.     false             // 不旋转文本
  10. );
复制代码
四、完备示例代码
  1. #include <opencv2/opencv.hpp>
  2. #include <opencv2/freetype.hpp>
  3. using namespace cv;
  4. // 全局字体管理器
  5. Ptr<freetype::FreeType2> initFreetype(const String& fontPath) {
  6.     auto ft = freetype::createFreeType2();
  7.     if (!ft->loadFontData(fontPath, 0)) {
  8.         throw std::runtime_error("字体加载失败");
  9.     }
  10.     return ft;
  11. }
  12. int main() {
  13.     // 创建空白画布
  14.     Mat canvas(480, 640, CV_8UC3, Scalar(255, 255, 255));
  15.    
  16.     // 初始化字体引擎
  17.     auto ft = initFreetype("msyh.ttf");
  18.    
  19.     // 设置绘制参数
  20.     String text = u8"OpenCV中文渲染测试";
  21.     int fontHeight = 30;
  22.     Scalar color(0, 0, 255); // BGR红色
  23.     Point origin(50, 150);
  24.    
  25.     // 计算文本尺寸
  26.     int baseline;
  27.     Size textSize = ft->getTextSize(text, fontHeight,
  28.                                    cv::FILLED, &baseline);
  29.    
  30.     // 绘制文本
  31.     ft->putText(canvas, text, origin, fontHeight,
  32.                color, 1, LINE_AA, false);
  33.    
  34.     // 显示结果
  35.     imshow("Chinese Rendering Demo", canvas);
  36.     waitKey(0);
  37.     return 0;
  38. }
复制代码

五、高级功能扩展

5.1 多行文本布局

通过循环盘算每行文本的基线位置:
  1. std::vector<String> lines = splitText(text, maxWidth);
  2. for (auto& line : lines) {
  3.     ft->putText(canvas, line, currentPos, ...);
  4.     currentPos.y += fontHeight + lineSpacing;
  5. }
复制代码
5.2 文本旋转支持

使用仿射变更实现恣意角度旋转:
  1. Mat rotationMat = getRotationMatrix2D(center, angle, 1.0);
  2. warpAffine(canvas, canvas, rotationMat, canvas.size());
复制代码
5.3 性能优化计谋


  • 字形缓存:预渲染常用字符到std::map容器
  • 批处理惩罚绘制:归并多个绘制指令淘汰矩阵拷贝
  • 多线程渲染:使用OpenCV的并行框架加快
六、常见标题排查

6.1 字体加载失败


  • 确认字体文件路径准确性
  • 查抄文件访问权限(Linux体系需chmod 644)
  • 验证字体文件完备性(使用字体查察工具)
6.2 笔墨体现暗昧


  • 启用抗锯齿模式(LINE_AA)
  • 进步字体渲染分辨率
  • 使用高质量TrueType字体
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表