java opencv 写入中文_OpenCV支持中文字符输出实现

在 http://www.opencv.org.cn/forum.php?mod=viewthread&tid=2083&extra=&page=1 中,作者给出了原始的在OpenCV中 支持中文字符的输入,原始的实现使用的是OpenCV的C接口,使用起来不怎么方便,这里对原作者的实现进行调整,通过OpenCV的C++接口实现中文的输出,调整后的code如下:

CvxText.hpp:

#ifndef OPENCV_CVX_TEXT_HPP_ #define OPENCV_CVX_TEXT_HPP_ // source from: http://www.opencv.org.cn/forum.php?mod=viewthread&tid=2083&extra=&page=1 // 支持OpenCV中文汉字输入 #include #include FT_FREETYPE_H #include class CvxText { public: /** * 装载字库文件 */ CvxText(const char* freeType); virtual ~CvxText(); /** * 获取字体.目前有些参数尚不支持. * * param font 字体类型, 目前不支持 * param size 字体大小/空白比例/间隔比例/旋转角度 * param underline 下画线 * param diaphaneity 透明度 * * sa setFont, restoreFont */ void getFont(int* type, cv::Scalar* size=nullptr, bool* underline=nullptr, float* diaphaneity=nullptr); /** * 设置字体.目前有些参数尚不支持. * * param font 字体类型, 目前不支持 * param size 字体大小/空白比例/间隔比例/旋转角度 * param underline 下画线 * param diaphaneity 透明度 * * sa getFont, restoreFont */ void setFont(int* type, cv::Scalar* size=nullptr, bool* underline=nullptr, float* diaphaneity=nullptr); /** * 恢复原始的字体设置. * * sa getFont, setFont */ void restoreFont(); /** * 输出汉字(颜色默认为黑色).遇到不能输出的字符将停止. * * param img 输出的影象 * param text 文本内容 * param pos 文本位置 * * return 返回成功输出的字符长度,失败返回-1. */ int putText(cv::Mat& img, const char* text, cv::Point pos); /** * 输出汉字(颜色默认为黑色).遇到不能输出的字符将停止. * * param img 输出的影象 * param text 文本内容 * param pos 文本位置 * * return 返回成功输出的字符长度,失败返回-1. */ int putText(cv::Mat& img, const wchar_t* text, cv::Point pos); /** * 输出汉字.遇到不能输出的字符将停止. * * param img 输出的影象 * param text 文本内容 * param pos 文本位置 * param color 文本颜色 * * return 返回成功输出的字符长度,失败返回-1. */ int putText(cv::Mat& img, const char* text, cv::Point pos, cv::Scalar color); /** * 输出汉字.遇到不能输出的字符将停止. * * param img 输出的影象 * param text 文本内容 * param pos 文本位置 * param color 文本颜色 * * return 返回成功输出的字符长度,失败返回-1. */ int putText(cv::Mat& img, const wchar_t* text, cv::Point pos, cv::Scalar color); private: // 禁止copy CvxText& operator=(const CvxText&); // 输出当前字符, 更新m_pos位置 void putWChar(cv::Mat& img, wchar_t wc, cv::Point& pos, cv::Scalar color); FT_Library m_library; // 字库 FT_Face m_face; // 字体 // 默认的字体输出参数 int m_fontType; cv::Scalar m_fontSize; bool m_fontUnderline; float m_fontDiaphaneity; }; #endif // OPENCV_CVX_TEXT_HPP_

CvxText.cpp:

#include #include #include #include #include #include "CvxText.hpp" // 打开字库 CvxText::CvxText(const char* freeType) { assert(freeType != NULL); // 打开字库文件, 创建一个字体 if(FT_Init_FreeType(&m_library)) throw; if(FT_New_Face(m_library, freeType, 0, &m_face)) throw; // 设置字体输出参数 restoreFont(); // 设置C语言的字符集环境 setlocale(LC_ALL, ""); } // 释放FreeType资源 CvxText::~CvxText() { FT_Done_Face(m_face); FT_Done_FreeType(m_library); } // 设置字体参数: // // font - 字体类型, 目前不支持 // size - 字体大小/空白比例/间隔比例/旋转角度 // underline - 下画线 // diaphaneity - 透明度 void CvxText::getFont(int* type, cv::Scalar* size, bool* underline, float* diaphaneity) { if (type) *type = m_fontType; if (size) *size = m_fontSize; if (underline) *underline = m_fontUnderline; if (diaphaneity) *diaphaneity = m_fontDiaphaneity; } void CvxText::setFont(int* type, cv::Scalar* size, bool* underline, float* diaphaneity) { // 参数合法性检查 if (type) { if(type >= 0) m_fontType = *type; } if (size) { m_fontSize.val[0] = std::fabs(size->val[0]); m_fontSize.val[1] = std::fabs(size->val[1]); m_fontSize.val[2] = std::fabs(size->val[2]); m_fontSize.val[3] = std::fabs(size->val[3]); } if (underline) { m_fontUnderline = *underline; } if (diaphaneity) { m_fontDiaphaneity = *diaphaneity; } FT_Set_Pixel_Sizes(m_face, (int)m_fontSize.val[0], 0); } // 恢复原始的字体设置 void CvxText::restoreFont() { m_fontType = 0; // 字体类型(不支持) m_fontSize.val[0] = 20; // 字体大小 m_fontSize.val[1] = 0.5; // 空白字符大小比例 m_fontSize.val[2] = 0.1; // 间隔大小比例 m_fontSize.val[3] = 0; // 旋转角度(不支持) m_fontUnderline = false; // 下画线(不支持) m_fontDiaphaneity = 1.0; // 色彩比例(可产生透明效果) // 设置字符大小 FT_Set_Pixel_Sizes(m_face, (int)m_fontSize.val[0], 0); } // 输出函数(颜色默认为白色) int CvxText::putText(cv::Mat& img, const char* text, cv::Point pos) { return putText(img, text, pos, CV_RGB(255, 255, 255)); } int CvxText::putText(cv::Mat& img, const wchar_t* text, cv::Point pos) { return putText(img, text, pos, CV_RGB(255,255,255)); } int CvxText::putText(cv::Mat& img, const char* text, cv::Point pos, cv::Scalar color) { if (img.data == nullptr) return -1; if (text == nullptr) return -1; int i; for (i = 0; text[i] != '

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值