OpenCV putText增加中文支持

OpenCV 默认并不支持中文字符显示,需要增加 freetype 支持,也需正确设置中文字体才能正常显示中文。

OpenCV 2.x 版本没有该模块,而 OpenCV 3.x 及以上版本才正式引入了 freetype 模块 ,可检查并更新到较新且包含该模块的版本。

OpenCV 默认 modules 中是不包含 freetype 的,其 freetype modules 在 opencv_contrib 库中,以 OpenCV 4.10.0 为例,需下载与 OpenCV 源码对应的 opencv_contrib 版本,并解压到 OpenCV 源码根目录;也可以在编译时指定 opencv_contrib 路径 -DOPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules

下面以 OpenCV 4.10.0 为例

一、编译

  1. 下载 OpenCV 4.10.0 源码
    OpenCV 官网https://github.com/opencv下载 4.10.0 源码
    https://github.com/opencv/opencv_contrib 下载 Tag 为 4.10.0 的 opencv_contrib
  2. 分别解压 opencv-4.10.0 和 opencv_contrib-4.10.0
bash 复制代码
unzip opencv-4.10.0.zip
tar xvf opencv_contrib-4.10.0.tar.gz
  1. 将 opencv_contrib-4.10.0 的 modules 拷贝到 opencv-4.10.0 中
    因为只需要使用freetype模块,此处只将 opencv_contrib-4.10.0中的freetype modules 拷贝到 opencv-4.10.0 modules 中
bash 复制代码
cp -a opencv_contrib-4.10.0/modules/freetype/ opencv-4.10.0/modules/
  1. 编译
bash 复制代码
cd opencv_contrib-4.10.0
mkdir build
cd build
cmake ..
make -j16
make install

编译成功后,头文件中应该包含

二、使用

需要包含头文件,opencv2/freetype.hpp

freetype 需加载外部的中文字体文件,如常见的宋体字体 SIMSUN.TTC 、黑体字体 simhei.ttf 等

示例如下:

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/freetype.hpp>

using namespace std;
using namespace cv;

int main(void)
{
    // 创建一个宽400、高100、颜色为蓝色(BGR 格式:255, 0, 0)的空白图片
    Mat image(100, 400, CV_8UC3, Scalar(255, 0, 0));
    // 检查图片是否创建成功
    if (image.empty()) {
        cout << "图片创建失败。" << endl;
        return -1;
    }
    // 创建 FreeType2 对象
    Ptr<freetype::FreeType2> ft2 = freetype::createFreeType2();
    // 加载字体文件
    ft2->loadFontData("./simsun.ttc", 0);
    int font_size = 25;
    // 在图像上绘制中文文本
    Point textOrg(0, 25);
    Scalar font_color(0, 0, 255);
    ft2->putText(image, "Hello OPenCV,你好,OPenCV。", textOrg, font_size, font_color, FILLED, LINE_AA, true);
    ft2->putText(image, "Hello OPenCV,你好,OPenCV。", Point(0, 50), font_size, font_color, FILLED, LINE_AA, true);
    ft2->putText(image, "Hello OPenCV,你好,OPenCV。", Point(0, 75), font_size, font_color, FILLED, LINE_AA, true);
    ft2->putText(image, "Hello OPenCV,你好,OPenCV。", Point(0, 100), font_size, font_color, FILLED, LINE_AA, true);
    // 创建窗口并显示图片
    namedWindow("Blue Blank Image", WINDOW_AUTOSIZE);
    imshow("Blue Blank Image", image);
    // 等待按键按下
    waitKey(0);
    // 销毁窗口
    destroyWindow("Blue Blank Image");
    return 0;
}

编译

bash 复制代码
g++ main.cpp -I /usr/local/include/opencv4/ -L /usr/local/lib  -lopencv_core -lopencv_highgui  -lopencv_freetype

运行

bash 复制代码
export LD_LIBRARY_PATH=/usr/local/lib
./a.out

在 OpenCV 的 putText 函数中,文字显示的 y 坐标对应的是文本左下角的位置。上述代码中,字体大小为25,4行文字刚好占满高度100。

三、总结

OpenCV putText 函数想要显示中文,不管什么版本的 OpenCV,都需要依赖 freetype。只不过 OpenCV 3.x 及以上版本,opencv_contrib 增加了 freetype 模块。OpenCV 2.x 若需要显示中文,可参考opencv_contrib freetype 模块自行封装。

相关推荐
Tp_jh13 小时前
AMD 395本地部署Qwen3.8-Flash-Next实测,端侧AGI时代也要来了
图像处理·人工智能·opencv·语言模型·自然语言处理·千问
yyk3332421 小时前
计算机视觉OpenCV中的FisherFace人脸识别
人工智能·opencv·计算机视觉
棣廷1 天前
初识OpenCV——Dlib人脸检测、关键点定位与表情识别
opencv·目标检测·机器学习
hhzz1 天前
【OpenCV 入门到精通 07】滤波、阈值与形态学:图像去噪与形状处理
人工智能·python·opencv·计算机视觉
华清远见成都中心1 天前
OpenCV中颜色空间有哪些区别
人工智能·opencv
词却2 天前
OpenCV学习:dlib 人脸检测
人工智能·opencv·学习
matlab代码2 天前
基于matlab阈值分割的车牌识别系统【源码75期】
图像处理·opencv·计算机视觉
leoZ2313 天前
2026-09-10-静态扫描连错三次-用运行环境当裁判
前端·javascript·vue.js·人工智能·opencv·机器学习·数据挖掘
hhzz3 天前
【OpenCV 入门到精通 05】核心操作与像素处理:ROI、运算与性能优化
人工智能·python·opencv·性能优化
2601_962293534 天前
第3.7章 机器人第三方库实战总结(七):OpenCV视觉SLAM核心库详解:API速查+源码实例+避坑指南
图像处理·opencv·计算机视觉·slam·第三方库