linux C++ opencv 绘制中文(源码编译opencv)
效果图:
第一步:安装 opencv 中文依赖
apt-get install libfreetype6-dev
第二步:在opencv编译时添加 WITH_FREETYPE=ON
完整编译示例:
调整编译内容
cmake -D CMAKE_BUILD_TYPE=RELEASE \-D WITH_FREETYPE=ON \..
开始编译
make -j8
安装到环境
make install
测试代码
项目结构,ttf一个就行
需要手动下载字体文件:.ttf文件
自己随便在网上下载就行
#include <opencv2/opencv.hpp>
#include <opencv2/freetype.hpp>
#include <iostream>int main() {// 初始化FreeType字体auto ft = cv::freetype::createFreeType2();// 使用指定的.ttf字体文件路径std::string font_path = "/root/UniSecurity/opencv_chiese/chiese_hei.ttf";try {ft->loadFontData(font_path, 0);} catch (...) {std::cerr << "字体加载失败,请检查路径是否正确: " << font_path << std::endl;return -1;}// 创建画布并绘制中文cv::Mat canvas(300, 500, CV_8UC3, cv::Scalar(255, 255, 255));// 绘制黑色中文 (BGR格式的黑色是(0,0,0))ft->putText(canvas, "中文测试", cv::Point(100, 200), 50, cv::Scalar(0, 0, 0), // 明确设置为黑色 (B=0, G=0, R=0)-1, cv::LINE_AA, false);// 保存结果cv::imwrite("chinese_test.png", canvas);std::cout << "图像已保存为 chinese_test.png" << std::endl;return 0;
}
CMakeLists.txt 文件内容
#CMakeLists.txt
# 设置:版本
cmake_minimum_required(VERSION 3.20)# 定义 :项目名称
project(first_cmake)# 设置构建类型为 Debug
set(CMAKE_BUILD_TYPE "Release")set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")# 查找 OpenCV
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV version: ${OpenCV_VERSION}")
message(STATUS "OpenCV libraries: ${OpenCV_LIBS}")
message(STATUS "OpenCV include path: ${OpenCV_INCLUDE_DIRS}")# 变成执行程序
# 参数:项目名字、源码名字、
add_executable(first_cmake main.cpp)# 链接库,避免重复使用 PUBLIC 关键字
target_link_libraries(first_cmake${OpenCV_LIBS}
)
run.sh 脚本
# 进入项目目录
cd /root/UniSecurity/opencv_chiese
# 使用下面步骤代替第一步,原因是有些cmake版本不支持(-S -B)参数
rm -rf buildmkdir build && cd build && cmake .. && cd ../
# 下面一样
cmake --build build
./build/first_cmake
踩坑1
问题:中文显示了, 但在末尾有问号。
问题出自系统换行符上,win 和 linux的换行符是不一样的
cat -v 1.txt
查看发现文件末尾出现 ^M 符号
解决方法:使用工具转换一下
# 安装转换工具(如果未安装)
apt-get install dos2unix
# 转换文件格式(清除^M字符)
dos2unix 1.txt