文档库

最新最全的文档下载
当前位置:文档库 > cvPutText opencv中汉字的输出

cvPutText opencv中汉字的输出

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

for(intj=o;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));

}