图像处理---《在图片上打印文字 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, 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, 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 >= 0) m_fontType = *type;}if(size){m_fontSize.val[0] = fabs(size->val[0]);m_fontSize.val[1] = fabs(size->val[1]);m_fontSize.val[2] = fabs(size->val[2]);m_fontSize.val[3] = fabs(size->val[3]);}if(underline){m_fontUnderline = *underline;}if(diaphaneity){m_fontDiaphaneity = *diaphaneity;} }// 恢复原始的字体设置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(IplImage *img, const char *text, CvPoint pos) {return putText(img, text, pos, CV_RGB(255,255,255)); } int CvxText::putText(IplImage *img, const wchar_t *text, CvPoint pos) {return putText(img, text, pos, CV_RGB(255,255,255)); }// int CvxText::putText(IplImage *img, const char *text, CvPoint pos, CvScalar color) {if(img == NULL) return -1;if(text == NULL) return -1;// int i;for(i = 0; text[i] != '\0'; ++i){wchar_t wc = text[i];// 解析双字节符号if(!isascii(wc)) mbtowc(&wc, &text[i++], 2);// 输出当前的字符 putWChar(img, wc, pos, color);}return i; } int CvxText::putText(IplImage *img, const wchar_t *text, CvPoint pos, CvScalar color) {if(img == NULL) return -1;if(text == NULL) return -1;// int i;for(i = 0; 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 = 0; i < rows; ++i){for(int j = 0; j < cols; ++j){int off = ((img->origin==0)? i: (rows-1-i))* slot->bitmap.pitch + j/8;if(slot->bitmap.buffer[off] & (0xC0 >> (j%8))){int r = (img->origin==0)? pos.y - (rows-1-i): pos.y + i;;int c = pos.x + j;if(r >= 0 && r < img->height&& c >= 0 && c < img->width){CvScalar scalar = cvGet2D(img, r, c);// 进行色彩融合float p = m_fontDiaphaneity;for(int k = 0; k < 4; ++k){scalar.val[k] = scalar.val[k]*(1-p) + color.val[k]*p;}cvSet2D(img, r, c, scalar);}}} // end for} // end for// 修改下一个字的输出位置double space = m_fontSize.val[0]*m_fontSize.val[1];double sep = m_fontSize.val[0]*m_fontSize.val[2];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(100, 150), CV_RGB(0,255,0));}cvShowImage("test", img ); cvWaitKey(-1);cvReleaseImage(&img);return 0; }
致谢: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
转载于:https://www.cnblogs.com/carle-09/p/11093452.html
图像处理---《在图片上打印文字 FreeType库》相关推荐
- C++ 在图片上打印文字并保存图片
int score_record(IplImage* image, string scoreNum, float score ) {CvFont font; //传值给cvPutText()的CvFo ...
- python实现图片上打印文字
话不多说直接上代码 #先导入所需的包 from PIL import ImageFont, Image, ImageDraw#导入本地字体路径及设置字体大小 font = ImageFont.true ...
- Python使用pillow库往图片上写入文字或覆盖另一张图片
Python使用pillow库往图片上写入文字或覆盖另一张图片 python之pillow是 Python 的第三方图像处理库.pillow是PIL( Python Imaging Library)基 ...
- php 用gd库在图片上写文字,并处理文字糊模问题
今天有个需求,用php在一张图片上写文字. 这个不是挺简单的嘛?我在一个test.php文件上,敲出6行代码,搞定 img=imagecreatefrompng("C:\Users\Admi ...
- php 图片上加文字,php使用GD库实现图片上添加文字的方法(代码)
本篇文章给大家带来的内容是关于php使用GD库实现图片上添加文字的方法(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我们可以利用php的gd库扩展来对我们的图片进行处理,例 ...
- php打印文字到图片,【PHP】打开一个图片然后加上水印(图片上生成文字)
1.自动生成图片,在图片上生成文字 Header("Content-type: image/gif"); //设置Header,如果输出图片不成功,请先暂时去掉这代码查看错误 $i ...
- chatgpt赋能python:Python去除图片上的文字:技术与应用
Python去除图片上的文字:技术与应用 随着互联网的发展,图片的使用越来越广泛.然而,有些图片上却存在着不必要的文字,影响了用户的阅读体验和SEO效果.在这种情况下,Python可以帮助我们快速.准 ...
- python3识别图中的文字_Python3.x:如何识别图片上的文字
Python3.x:如何识别图片上的文字 安装pytesseract库,必须先安装其依赖的PIL及tesseract-ocr,其中PIL为图像处理库,而后面的tesseract-ocr则为google ...
- 网页怎么在图片上添加文字_想给图片添加文字,留白,添加小印章?用手机三步搞定...
如今越来越多的伙伴喜欢手机摄影,拍好的照片,还可以制作各种精美的图文,直接表达心情的同时,还能获得一片"赞"! 效果1: 图片下方留白+圆形印章 效果2: 图片上下方留白+椭圆形印 ...
最新文章
- python冒泡排序
- seaborn可视化散点图并自定义可视化结果图像的大小(Change the Size of a Seaborn Plot)
- 第二十二回 基础才是重中之重~ThreadStatic静态字段在每个线程里的唯一性
- asp.net使用mysql教程_在C#程序中使用MYSQL数据库
- SQL基础---SQL WHERE 子句
- 2021年终总结-向着阳光前进
- delphi ui编辑工具源码_一种无侵入比swagger-ui兼容性更好更简单的API文档生成方案
- 同济大学计算机基础教研网,消除部分依赖S1(Snum,Sname,Sdept-同济大学计算机基础教研室.ppt...
- 系统安装重装与优化:chapter7 操作系统的修复与重装
- Mysql分析排序和锁阅读总结
- Java数据库连接池c3p0和druid
- eclipse安装反编译工具
- 获取Android 光感Sensor的值
- 二叉树 --5.1.3 Binary Tree Zigzag Level Order Traversal --图解
- 删除小于一定尺寸的模型
- 读书笔记(10)网络规划与设计
- PV、EV、AC、BAC、EAC、ETC等的含义及计算公式
- ISE14.7添加工程外部的IP核
- Tableau可视化---Tableau简介
- PCL库中I/O操作
热门文章
- Smack 4.3.2 发布,XMPP(jabber) 的 Java 客户端类库
- shell中判断远程主机的某个tcp端口是否存活
- Table of Delphi data types and C++ types
- python爬虫网络中断_Python 爬虫总是超时中断?试试Tenacity重试模块
- JavaScript字符串String常用方法介绍
- 第二篇:稳定性之如何有条不紊地应对风险?
- 不需要mysql的php博客_不用数据库,做留言板(PHP)
- matlab背景点状,基于MATLAB的点状目标检测
- java jtable defaulttablemodel_java – JTable和DefaultTableModel
- oracle delete远程表,用脚本实现表的远程准实时同步