图像处理---《在图片上打印文字 FreeType库》
图像处理---《在图片上打印文字 FreeType库》
目的:想在处理之后的图像上打印输出结果。
方法: (1)只在图像上打印 数字、字母的话:
1.Mat格式的图像,可以使用opencv自带的putText()。
2.IPLImage格式的图像,可以使用自带的cvInitFont和cvPutText函数。
(2)在图像上打印 汉字的话,可以使用FreeType库。
FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件。
第一步:下载 FreeType(),https://sourceforge.net/projects/freetype/files/freetype2/2.4.10/,下载一个想用的 FreeType版本,这里如freetype-2.4.10.tar.gz 。
第二步:解压FreeType(),点击D:\freetype-2.4.10\builds\win32\vc2010\freetype.sln,用相应的版本---VS2010打开,右键---生成,编译一下。
在D:\freetype-2.4.10\objs\win32\vc2010文件下生成一个freetype2410_D.lib文件。
说明:第一、二步,如果可以从别人那里拷贝,可以直接拷贝过来,比如我刚开始拷贝的就是一个cvtext文件夹,里面含有include和lib文件,就是上面两步生成的。
********************************************************************************************

第三步:在VS中新建一个项目,比如名字putText_FreeType,配置一下VS2010与freetype的关系,和刚开始用opencv的方法类似。
freetype路径配置好后,工程中加入中文字体,如simhei.ttf,以及CvxText.h、CvxText.cpp、text_in_image.cpp。然后可以愉快玩耍了。
CvxText.h、CvxText.cpp、text_in_image.cpp,参照网上资源。
********************************************************************************************

********************************************************************************************

********************************************************************************************

********************************************************************************************

********************************************************************************************

********************************************************************************************

********************************************************************************************

********************************************************************************************
//====================================================================
//====================================================================
//
// 文件: CvxText.h
//
// 说明: OpenCV汉字输出
//
//====================================================================
//==================================================================== #ifndef OPENCV_CVX_TEXT_2007_08_31_H
#define OPENCV_CVX_TEXT_2007_08_31_H /**
* \file CvxText.h
* \brief OpenCV汉字输出接口
*
* 实现了汉字输出功能。
*/ #include <ft2build.h>
#include FT_FREETYPE_H
#include <opencv2\opencv.hpp>
//modified
//将CvxText.h中的#include<cv.h> #include <highgui.h>用#include<opnecv2/opencv.hpp>替代; /**
* \class CvxText
* \brief OpenCV中输出汉字
*
* OpenCV中输出汉字。字库提取采用了开源的FreeFype库。由于FreeFype是
* GPL版权发布的库,和OpenCV版权并不一致,因此目前还没有合并到OpenCV
* 扩展库中。
*
* 显示汉字的时候需要一个汉字字库文件,字库文件系统一般都自带了。
* 这里采用的是一个开源的字库:“文泉驿正黑体”。
*
* 关于"OpenCV扩展库"的细节请访问
* http://code.google.com/p/opencv-extension-library/
*
* 关于FreeType的细节请访问
* http://www.freetype.org/
*
* 例子:
*
* \code
int main(int argc, char *argv[])
{
// 定义CvxApplication对象 CvxApplication app(argc, argv); // 打开一个影象 IplImage *img = cvLoadImage("test.jpg", 1); // 输出汉字 {
// "wqy-zenhei.ttf"为文泉驿正黑体 CvText text("wqy-zenhei.ttf"); const char *msg = "在OpenCV中输出汉字!"; float p = 0.5;
text.setFont(NULL, NULL, NULL, &p); // 透明处理 text.putText(img, msg, cvPoint(100, 150), CV_RGB(255,0,0));
}
// 定义窗口,并显示影象 CvxWindow myWin("myWin");
myWin.showImage(img); // 进入消息循环 return app.exec();
}
* \endcode
*/ class CvxText
{
// 禁止copy CvxText& operator=(const CvxText&); //================================================================
//================================================================ public: /**
* 装载字库文件
*/ CvxText(const char *freeType);
virtual ~CvxText(); //================================================================
//================================================================ /**
* 获取字体。目前有些参数尚不支持。
*
* \param font 字体类型, 目前不支持
* \param size 字体大小/空白比例/间隔比例/旋转角度
* \param underline 下画线
* \param diaphaneity 透明度
*
* \sa setFont, restoreFont
*/ void getFont(int *type,
CvScalar *size=NULL, bool *underline=NULL, float *diaphaneity=NULL); /**
* 设置字体。目前有些参数尚不支持。
*
* \param font 字体类型, 目前不支持
* \param size 字体大小/空白比例/间隔比例/旋转角度
* \param underline 下画线
* \param diaphaneity 透明度
*
* \sa getFont, restoreFont
*/ void setFont(int *type,
CvScalar *size=NULL, bool *underline=NULL, float *diaphaneity=NULL); /**
* 恢复原始的字体设置。
*
* \sa getFont, setFont
*/ void restoreFont(); //================================================================
//================================================================ /**
* 输出汉字(颜色默认为黑色)。遇到不能输出的字符将停止。
*
* \param img 输出的影象
* \param text 文本内容
* \param pos 文本位置
*
* \return 返回成功输出的字符长度,失败返回-1。
*/ int putText(IplImage *img, const char *text, CvPoint pos); /**
* 输出汉字(颜色默认为黑色)。遇到不能输出的字符将停止。
*
* \param img 输出的影象
* \param text 文本内容
* \param pos 文本位置
*
* \return 返回成功输出的字符长度,失败返回-1。
*/ int putText(IplImage *img, const wchar_t *text, CvPoint pos); /**
* 输出汉字。遇到不能输出的字符将停止。
*
* \param img 输出的影象
* \param text 文本内容
* \param pos 文本位置
* \param color 文本颜色
*
* \return 返回成功输出的字符长度,失败返回-1。
*/ int putText(IplImage *img, const char *text, CvPoint pos, CvScalar color); /**
* 输出汉字。遇到不能输出的字符将停止。
*
* \param img 输出的影象
* \param text 文本内容
* \param pos 文本位置
* \param color 文本颜色
*
* \return 返回成功输出的字符长度,失败返回-1。
*/
int putText(IplImage *img, const wchar_t *text, CvPoint pos, CvScalar color); //================================================================
//================================================================ private: // 输出当前字符, 更新m_pos位置 void putWChar(IplImage *img, wchar_t wc, CvPoint &pos, CvScalar color); //================================================================
//================================================================ private: FT_Library m_library; // 字库
FT_Face m_face; // 字体 //================================================================
//================================================================ // 默认的字体输出参数 int m_fontType;
CvScalar m_fontSize;
bool m_fontUnderline;
float m_fontDiaphaneity; //================================================================
//================================================================
}; #endif // OPENCV_CVX_TEXT_2007_08_31_H
//====================================================================
//====================================================================
//
// 文件: CvxText.cpp
//
// 说明: OpenCV汉字输出
//
//====================================================================
//==================================================================== #include <wchar.h>
#include <assert.h>
#include <locale.h>
#include <ctype.h> #include "CvxText.h" //====================================================================
//==================================================================== // 打开字库 CvxText::CvxText(const char *freeType)
{
assert(freeType != NULL); // 打开字库文件, 创建一个字体 if(FT_Init_FreeType(&m_library)) throw;
if(FT_New_Face(m_library, freeType, , &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, CvScalar *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, CvScalar *size, bool *underline, float *diaphaneity)
{
// 参数合法性检查 if(type)
{
if(type >= ) m_fontType = *type;
}
if(size)
{
m_fontSize.val[] = fabs(size->val[]);
m_fontSize.val[] = fabs(size->val[]);
m_fontSize.val[] = fabs(size->val[]);
m_fontSize.val[] = fabs(size->val[]);
}
if(underline)
{
m_fontUnderline = *underline;
}
if(diaphaneity)
{
m_fontDiaphaneity = *diaphaneity;
}
} // 恢复原始的字体设置 void CvxText::restoreFont()
{
m_fontType = ; // 字体类型(不支持) m_fontSize.val[] = ; // 字体大小
m_fontSize.val[] = 0.5; // 空白字符大小比例
m_fontSize.val[] = 0.1; // 间隔大小比例
m_fontSize.val[] = ; // 旋转角度(不支持) m_fontUnderline = false; // 下画线(不支持) m_fontDiaphaneity = 1.0; // 色彩比例(可产生透明效果) // 设置字符大小 FT_Set_Pixel_Sizes(m_face, (int)m_fontSize.val[], );
} // 输出函数(颜色默认为黑色) int CvxText::putText(IplImage *img, const char *text, CvPoint pos)
{
return putText(img, text, pos, CV_RGB(,,));
}
int CvxText::putText(IplImage *img, const wchar_t *text, CvPoint pos)
{
return putText(img, text, pos, CV_RGB(,,));
} // int CvxText::putText(IplImage *img, const char *text, CvPoint pos, CvScalar color)
{
if(img == NULL) return -;
if(text == NULL) return -; // int i;
for(i = ; text[i] != '\0'; ++i)
{
wchar_t wc = text[i]; // 解析双字节符号 if(!isascii(wc)) mbtowc(&wc, &text[i++], ); // 输出当前的字符 putWChar(img, wc, pos, color);
}
return i;
}
int CvxText::putText(IplImage *img, const wchar_t *text, CvPoint pos, CvScalar color)
{
if(img == NULL) return -;
if(text == NULL) return -; // int i;
for(i = ; text[i] != '\0'; ++i)
{
// 输出当前的字符 putWChar(img, text[i], pos, color);
}
return i;
} // 输出当前字符, 更新m_pos位置 void CvxText::putWChar(IplImage *img, wchar_t wc, CvPoint &pos, CvScalar color)
{
// 根据unicode生成字体的二值位图 FT_UInt glyph_index = FT_Get_Char_Index(m_face, wc);
FT_Load_Glyph(m_face, glyph_index, FT_LOAD_DEFAULT);
FT_Render_Glyph(m_face->glyph, FT_RENDER_MODE_MONO); // FT_GlyphSlot slot = m_face->glyph; // 行列数 int rows = slot->bitmap.rows;
int cols = slot->bitmap.width; // for(int i = ; i < rows; ++i)
{
for(int j = ; j < cols; ++j)
{
int off = ((img->origin==)? i: (rows--i))
* slot->bitmap.pitch + j/; if(slot->bitmap.buffer[off] & (0xC0 >> (j%)))
{
int r = (img->origin==)? pos.y - (rows--i): pos.y + i;;
int c = pos.x + j; if(r >= && r < img->height
&& c >= && c < img->width)
{
CvScalar scalar = cvGet2D(img, r, c); // 进行色彩融合 float p = m_fontDiaphaneity;
for(int k = ; k < ; ++k)
{
scalar.val[k] = scalar.val[k]*(-p) + color.val[k]*p;
} cvSet2D(img, r, c, scalar);
}
}
} // end for
} // end for // 修改下一个字的输出位置 double space = m_fontSize.val[]*m_fontSize.val[];
double sep = m_fontSize.val[]*m_fontSize.val[]; pos.x += (int)((cols? cols: space) + sep);
}
//====================================================================
//====================================================================
//
// 文件: text_in_image.cpp
//
// 说明: OpenCV汉字输出
//
//====================================================================
//====================================================================
#include <iostream>
#include "opencv2/opencv.hpp"
#include"CvxText.h" using namespace std;
using namespace cv;
//--------------------------------IPLImage格式的图像, 使用FreeType库---------------------------------------
int main(int argc, char *argv[])
{
IplImage *img = cvLoadImage("D:\\005_test_4\\testImg\\road_6.png");
{
CvxText text("simfang.ttf");
const char *msg = "汉字!汉字!汉字!";
float p = 1.5;
text.setFont(NULL, NULL, NULL, &p);
text.putText(img, msg, cvPoint(, ), CV_RGB(,,));
}
cvShowImage("test", img ); cvWaitKey(-);
cvReleaseImage(&img);
return ;
}

致谢:https://blog.csdn.net/ubunfans/article/details/45719009;https://blog.csdn.net/shakevincent/article/details/52950294
https://blog.csdn.net/fengbingchun/article/details/8029337;https://blog.csdn.net/qq_30490125/article/details/51817321
图像处理---《在图片上打印文字 FreeType库》的更多相关文章
- 图像处理---《在图片上打印文字 windows+GDI+TrueType字体》
图像处理---<在图片上打印文字 windows+GDI+TrueType字体> 刚开始使用的是putText()函数做,缺陷是只能显示非中文: 接着,看大多数推荐Freetype库来做 ...
- 图像处理---《在图片上打印文字 putText()》
图像处理---<在图片上打印文字 putText()> 目的:想在处理之后的图像上打印输出结果. 方法: (1)只在图像上打印 数字.字母的话: 1.Mat ...
- C#图像处理(1):在图片上加文字和改变文字的方向
C#在图片上加文字,代码如下: /// <summary> /// 图片上方加文字,文字将会被180度反转 /// </summary> /// <param name= ...
- Python3.x:如何识别图片上的文字
Python3.x:如何识别图片上的文字 安装pytesseract库,必须先安装其依赖的PIL及tesseract-ocr,其中PIL为图像处理库,而后面的tesseract-ocr则为google ...
- C#实现图片叠加,图片上嵌入文字,文字生成图片的方法
/// <summary> /// 图片叠加 /// </summary> /// <param name="sender"& ...
- python 图片上添加文字
import PIL from PIL import ImageFont from PIL import Image from PIL import ImageDraw #设置字体,如果没有,也可以不 ...
- 使用Qpaint在图片上写文字
开发过程中需要实现在图片上叠加文字,可以采用Qpaint在图片上写文字,然后将图片显示在上面.再将Qlabel加到Qwidget中.效果如下 //创建对象,加载图片 QPixmap pix; pix. ...
- 函数putText()在图片上写文字
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace c ...
- 把图片上的文字转换成word文字?
转换后的文字不是很如意,但是免费方便. 1.打开Office办公软件自带的OneNote工具.随便新建一个笔记页面,以方便我们接下来的操作. 2.插入图片.在菜单栏里点击[插入],选择插入[图片],找 ...
随机推荐
- 重置mysql数据库root密码
一. 在已知MYSQL数据库的ROOT用户密码的情况下,修改密码的方法:1,shell环境下:]#mysqladmin –u root –p password “新密码” 回车后要求输入旧密码2,my ...
- 【ARM-Linux开发】内核3.x版本之后设备树机制
内核3.x版本之后设备树机制 Based on Linux 3.10.24 source code 参考/documentation/devicetree/Booting-without- ...
- Java文章翻译
一.基础 1.String 使用" "还是构造函数创建字符串? 画图说明字符串的不变性 在Java中字符串为什么是不可变的 Java中的字符串是按引用传递? 排名前十的Java字符 ...
- confluence导出PDF格式文件不显示中文解决
由于confluence导出PDF格式文件需要应用字体文件,下载字体文件在confluence管理员界面安装即可. 我这里使用从simhei.ttf楷体,可以从windowns主机里下载(c:/win ...
- *#【Python】【基础知识】【模块】【datetime】【使用datetime模块 】
datetime模块 的介绍: 用于调取时间.日期 datetime包含的 方法: >>> dir(datetime) ['MAXYEAR', 'MINYEAR', '__built ...
- Scala 孤立对象和单例对象方法体的用法和例子
[学习笔记] 1 以object关键字修饰一个类名,这种语法叫做孤立对象,这个对象是单例的. 相当于将单例类和单例对象同时定义.相当于java中的单例,即在内存中只会存在一个Test3实例.创建一个 ...
- NOIP比赛中如何加速c++的输入输出
NOIP比赛中如何加速c++的输入输出 在竞赛中,遇到大数据时,往往需要更快的读取方式.由于比赛中输出一般规模较小,本文只讨论输入如何加速. 现在我们生成1000000个随机数,构成1000*1000 ...
- PHP学习之PHP trait解析
自PHP5.4.0起,PHP实现了一种代码复用的方法,称为trait. 众所周知,PHP中是单继承的,trait是为类似PHP的单继承语言而准备得一种代码复用机制.trait为了减少单继承语言的限制, ...
- Thinkphp命令行快速生成模型类方法
进去cmd,切换到项目根目录,也就是think文件所在目录,执行下面的指令可以生成index模块的blog模型类文件: >php think make:model index/Blog 生成的模 ...
- django类视图的使用
1 类视图引入 以函数的方式定义的视图称为函数视图,函数视图便于理解. 但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳 ...