aihot  2017-05-27 15:17:32  OpenCV |   查看评论   

CvxText.cpp:

  1. #include <wchar.h>  
  2. #include <assert.h>  
  3. #include <locale.h>  
  4. #include <ctype.h>  
  5.   
  6. #include "CvxText.h"  
  7.   
  8. //====================================================================  
  9. //====================================================================  
  10.   
  11. // 打开字库  
  12.   
  13. CvxText::CvxText(const char *freeType)  
  14. {  
  15.    assert(freeType != NULL);  
  16.   
  17.    // 打开字库文件, 创建一个字体  
  18.   
  19.    if(FT_Init_FreeType(&m_library)) throw;  
  20.    if(FT_New_Face(m_library, freeType, 0, &m_face)) throw;  
  21.   
  22.    // 设置字体输出参数  
  23.   
  24.    restoreFont();  
  25.   
  26.    // 设置C语言的字符集环境  
  27.   
  28.    setlocale(LC_ALL, "");  
  29. }  
  30.   
  31. // 释放FreeType资源  
  32.   
  33. CvxText::~CvxText()  
  34. {  
  35.    FT_Done_Face    (m_face);  
  36.    FT_Done_FreeType(m_library);  
  37. }  
  38.   
  39. // 设置字体参数:  
  40. //  
  41. // font         - 字体类型, 目前不支持  
  42. // size         - 字体大小/空白比例/间隔比例/旋转角度  
  43. // underline   - 下画线  
  44. // diaphaneity   - 透明度  
  45.   
  46. void CvxText::getFont(int *type, CvScalar *size, bool *underline, float *diaphaneity)  
  47. {  
  48.    if(type) *type = m_fontType;  
  49.    if(size) *size = m_fontSize;  
  50.    if(underline) *underline = m_fontUnderline;  
  51.    if(diaphaneity) *diaphaneity = m_fontDiaphaneity;  
  52. }  
  53.   
  54. void CvxText::setFont(int *type, CvScalar *size, bool *underline, float *diaphaneity)  
  55. {  
  56.    // 参数合法性检查  
  57.   
  58.    if(type)  
  59.    {  
  60.       if(type >= 0) m_fontType = *type;  
  61.    }  
  62.    if(size)  
  63.    {  
  64.       m_fontSize.val[0] = fabs(size->val[0]);  
  65.       m_fontSize.val[1] = fabs(size->val[1]);  
  66.       m_fontSize.val[2] = fabs(size->val[2]);  
  67.       m_fontSize.val[3] = fabs(size->val[3]);  
  68.    }  
  69.    if(underline)  
  70.    {  
  71.       m_fontUnderline   = *underline;  
  72.    }  
  73.    if(diaphaneity)  
  74.    {  
  75.       m_fontDiaphaneity = *diaphaneity;  
  76.    }  
  77. }  
  78.   
  79. // 恢复原始的字体设置  
  80.   
  81. void CvxText::restoreFont()  
  82. {  
  83.    m_fontType = 0;            // 字体类型(不支持)  
  84.   
  85.    m_fontSize.val[0] = 20;      // 字体大小  
  86.    m_fontSize.val[1] = 0.5;   // 空白字符大小比例  
  87.    m_fontSize.val[2] = 0.1;   // 间隔大小比例  
  88.    m_fontSize.val[3] = 0;      // 旋转角度(不支持)  
  89.   
  90.    m_fontUnderline   = false;   // 下画线(不支持)  
  91.   
  92.    m_fontDiaphaneity = 1.0;   // 色彩比例(可产生透明效果)  
  93.   
  94.    // 设置字符大小  
  95.   
  96.    FT_Set_Pixel_Sizes(m_face, (int)m_fontSize.val[0], 0);  
  97. }  
  98.   
  99. // 输出函数(颜色默认为黑色)  
  100.   
  101. int CvxText::putText(IplImage *img, const char    *text, CvPoint pos)  
  102. {  
  103.    return putText(img, text, pos, CV_RGB(255,255,255));  
  104. }  
  105. int CvxText::putText(IplImage *img, const wchar_t *text, CvPoint pos)  
  106. {  
  107.    return putText(img, text, pos, CV_RGB(255,255,255));  
  108. }  
  109.   
  110. //  
  111.   
  112. int CvxText::putText(IplImage *img, const char    *text, CvPoint pos, CvScalar color)  
  113. {  
  114.    if(img == NULL) return -1;  
  115.    if(text == NULL) return -1;  
  116.   
  117.    //  
  118.   
  119.    int i;  
  120.    for(i = 0; text[i] != '\0'; ++i)  
  121.    {  
  122.       wchar_t wc = text[i];  
  123.   
  124.       // 解析双字节符号  
  125.   
  126.       if(!isascii(wc)) mbtowc(&wc, &text[i++], 2);  
  127.   
  128.       // 输出当前的字符  
  129.   
  130.       putWChar(img, wc, pos, color);  
  131.    }  
  132.    return i;  
  133. }  
  134. int CvxText::putText(IplImage *img, const wchar_t *text, CvPoint pos, CvScalar color)  
  135. {  
  136.    if(img == NULL) return -1;  
  137.    if(text == NULL) return -1;  
  138.   
  139.    //  
  140.   
  141.    int i;  
  142.    for(i = 0; text[i] != '\0'; ++i)  
  143.    {  
  144.       // 输出当前的字符  
  145.   
  146.       putWChar(img, text[i], pos, color);  
  147.    }  
  148.    return i;  
  149. }  
  150.   
  151. // 输出当前字符, 更新m_pos位置  
  152.   
  153. void CvxText::putWChar(IplImage *img, wchar_t wc, CvPoint &pos, CvScalar color)  
  154. {  
  155.    // 根据unicode生成字体的二值位图  
  156.   
  157.    FT_UInt glyph_index = FT_Get_Char_Index(m_face, wc);  
  158.    FT_Load_Glyph(m_face, glyph_index, FT_LOAD_DEFAULT);  
  159.    FT_Render_Glyph(m_face->glyph, FT_RENDER_MODE_MONO);  
  160.   
  161.    //  
  162.   
  163.    FT_GlyphSlot slot = m_face->glyph;  
  164.   
  165.    // 行列数  
  166.   
  167.    int rows = slot->bitmap.rows;  
  168.    int cols = slot->bitmap.width;  
  169.   
  170.    //  
  171.   
  172.    for(int i = 0; i < rows; ++i)  
  173.    {  
  174.       for(int j = 0; j < cols; ++j)  
  175.       {  
  176.          int off  = ((img->origin==0)? i: (rows-1-i))  
  177.             * slot->bitmap.pitch + j/8;  
  178.   
  179.          if(slot->bitmap.buffer[off] & (0xC0 >> (j%8)))  
  180.          {  
  181.             int r = (img->origin==0)? pos.y - (rows-1-i): pos.y + i;;  
  182.             int c = pos.x + j;  
  183.            
  184.             if(r >= 0 && r < img->height  
  185.                && c >= 0 && c < img->width)  
  186.             {  
  187.                CvScalar scalar = cvGet2D(img, r, c);  
  188.   
  189.                // 进行色彩融合  
  190.   
  191.                float p = m_fontDiaphaneity;  
  192.                for(int k = 0; k < 4; ++k)  
  193.                {  
  194.                   scalar.val[k] = scalar.val[k]*(1-p) + color.val[k]*p;  
  195.                }  
  196.   
  197.                cvSet2D(img, r, c, scalar);  
  198.             }  
  199.          }  
  200.       } // end for  
  201.    } // end for  
  202.   
  203.    // 修改下一个字的输出位置  
  204.   
  205.    double space = m_fontSize.val[0]*m_fontSize.val[1];  
  206.    double sep   = m_fontSize.val[0]*m_fontSize.val[2];  
  207.   
  208.    pos.x += (int)((cols? cols: space) + sep);  
  209. }  
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自OpenCV来实现在图像中写入汉字

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]