cvPutText opencv中汉字的输出
OPENCV 不支持汉字输出,但可以修改其代码,支持汉字。
字符输出在nitFont、cvPutText、cvGetSize三个函数中,文件在cxcore\src\cxdrawing.cpp
函数介绍:
void cvlnitFont(CvFont*font,int font_face,double hscale,double vscale,double shear,int thickness,int line_type);
/*font表示被初始化的字体结构体。
font_face字体名称标识符,目前仅支持CV_FONT_HERSHEY_SIMPLEX等少数几种字体。
hscale表示字体宽度的放大系数,例如0.5f表示宽度为原来的一半,shear字体豹裁瘦的斜率,1表示字体倾斜45度。
thickness表示字体笔划的粗细程度。
line_type表示字体笔划的类型,具体参见cvLine。
*/
void cvPutText(CvArr *img,char+text,CvPoint org,CvFont *font,CvScalar color);
/*img表示图像。
这里要严格的ASCII字符,不能接受像GB2312等双字节编码。
org表示第1个字符左下角的坐标。
font表示字体结构体。
color表示文本的字体颜色。
*/
字符编码:ASCII(一个字节),GB2313(两个字节),Unicode(两个字节).unicode兼容ASCII,不兼容GB,需要ANSI-C语言来转换.
思想如下:
1,解析汉字的编码;2,根据汉字编码装载汉字的形状;3,输出汉字的形状。
1,从char --> wchar_t
2,采用TrueType 字库。
利用开源的FreeType库来处理字库。
具体如下:
用FreeType的API提取一个字符的过程如下:{
FT_Library m_library;//字库
FT_Face m face;//字体
//打开字库文件,创建一个字体
FT_Init_FreeType(&m_library);
FT_New_Face(m_library,"TrueType.ttf,0,&m_face);
∥根据字符的编码得到字符的索引位置
//根据字符在字库中索引得到字库轮廓
//根据字符的轮廓渲染字符的二值位图
FT_UInt glyph_index=FT_Get_Char_Index(m_face,'中');
FT_Load_Glyph(m_face,glyph_index,FT_LOAD_DEFAULT);
FT_RenderGlyph(m_face->glyph,FT_RENDER_MODE_MONO);
//释放FreeType库管理的资源
FT_Done_Face(m_face);
FT_Done_FreeType(m_library);
}
3, 显示
字型对应的是字型的位图(m_face->glyph->bitmap),直接把字符对应的位图像素绘制到影像中即可。
影像中每个像素的颜色可以通过OpenCV中的cvSet2D函数设置。
实现代码如下:
void drawCharaeter(Ipllmage *image,FT_Face *face)
{
//处理Ipllmage影像的origin标志和ROI结构
yphSIot slot=m_face->gly
FT_GlyphSiot slot = m_face->glyph;
int rows=slot->bitmap.rows;
int cols=slot->bitmap.width;
for(int i=0;i<rows;++i){
for(intj=o;j<cols;++j){
int off=i*slot->bitmap.pitch+j/8;
int flag=slot->bitmap[off]&(0xc0>>(j%8));
cvSet2D(img,i,j,CV_RGB(255,255,255));
}。