当前位置: 首页 > 编程日记 > 正文

OpenCV实现在图像中写入汉字

由于OpenCV自带的cvInitFont和cvPutText函数不支持向图像中写入中文,参考http://www.opencv.org.cn/forum/viewtopic.php?t=2083 中的方法,在windows7 64位机上用vs2008+OpenCV2.3.1实现具体步骤如下:

1、新建一个控制台工程Test,先按照 http://blog.csdn.net/fengbingchun/article/details/7288079 中步骤配置;

2、将C:\WINDOWS\Fonts\simhei.ttf文件和CvxText.h、CvxText.cpp文件复制到工程Test文件夹下,并添加到Test工程中;

3、将CvxText.h中的#include<cv.h> #include <highgui.h>用#include<opnecv2/opencv.hpp>替代;

4、在CvxText.cpp文件首行添加#include”stdafx.h”,在函数setFont末尾加入FT_Set_Pixel_Sizes(m_face, (int)m_fontSize.val[0], 0)语句;

5、将include和lib两个文件夹放到D:\soft\OpenCV2.3.1\FreeType文件夹下;

6、Tool-->Options-->VC++ Directories:选择Include files:D:\soft\OpenCV2.3.1\FreeType\include;选择Library files:D:\soft\OpenCV2.3.1\FreeType\lib;

7、打开Property ,在Release和Debug下分别Linker-->Input-->Additional Dependencies添加freetype235.lib;

8、将原main.cpp文件内容复制到Test.cpp中,将#include<cv.h> #include <highgui.h>用#include<opnecv2/opencv.hpp>替代,将图像lena.jpg复制到工程Test文件夹下,编译运行即可。

CvxText.h:

//====================================================================
//====================================================================
//
// 文件: CvxText.h
//
// 说明: OpenCV汉字输出
//
// 时间: 
//
// 作者: chaishushan#gmail.com
//
//====================================================================
//====================================================================#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 <cv.h>
#include <highgui.h>/**
* \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  
{// 禁止copyCvxText& 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:

#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);
}


相关文章:

Operations Manager 2012 SP1配置部署系列之(二) SCOM监控SCVMM

你可以使用Operations Mangager连接到VMM上去监控VMM管理的虚拟机和虚拟机的主机的健康和可用性.你还可以监视VMM管理服务器的健康和可用性&#xff0c;VMM数据库服务器、存储库服务器&#xff0c;和矢量调制法的自服务门户web服务器.当你把VMM与Operations Mangager集成、VMM的…

ROS中base_link, odom, fixed_frame, target_frame和虚拟大地图map的关系

前面已经介绍了如何使用URDF建造机器人小车并显示在Rviz的仿真环境里面&#xff0c;但是小车是静止的。下面介绍如何让它在Rviz里面动起来&#xff0c;并理清URDF,TF 和 odom 的关系。 1. ROS中base_link, odom, fixed_frame, target_frame和虚拟大地图map的关系 一般在urdf文件…

谷歌新研究:基于数据共享的神经网络快速训练方法

作者 | Google Brain译者 | 凯隐责编 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;神经网络技术的普及离不开硬件技术的发展&#xff0c;GPU 和 TPU 等硬件型训练加速器带来的高算力极大的缩短了训练模型需要的时间&#xff0c;使得研究者们…

制作一个简单的linux

我这里是借助宿主机做的一个简单的Linux&#xff0c;我们只要知道一个Linux启动过程需要什么&#xff0c;这里制作就简单的多了。不过没有基础的也没关系&#xff0c;我写的很详细&#xff0c;没有基础的看了我写的步骤只要细心也是会做出来的&#xff0c;我这里的小Linux是很简…

nginx是什么,如何使用

一&#xff1a;nginx是什么&#xff1f; 二&#xff1a;nginx作为网关&#xff0c;需要具备什么&#xff1f;&#xff08;nginx可以作为web服务器&#xff0c;但更多的时候&#xff0c;我们把它作为网关&#xff0c;因为它具备网关必备的功能&#xff1a;&#xff09; 反向代理…

OpenCV中Mat数据结构使用举例

#include "stdafx.h"#include <string>#include <iostream>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;int _tmain(int argc, _TCHAR* argv[]){//创建一个用13j填充的 7 x 7 复矩阵-----1Mat M(7, 7, CV_32FC2, Scalar…

贾扬清加盟AI开发者大会!早鸟票抢购正式开启

整理 | 夕颜硬核 AI 技术大会&#xff0c;一年参加一次就够了。9 月 6日-7 日&#xff0c;2019 AI 开发者大会&#xff08;AI ProCon&#xff09;将在北京富力万丽酒店举行&#xff0c;人工领域技术领袖将再次齐聚一堂&#xff0c;探讨过去一年最新的 AI 技术趋势与变化&#x…

基本控件HyperlinkButton控件

HyperlinkButton控件可用来作为超链接按钮&#xff0c;支持页面导航。 若导航到MainPage.xaml&#xff0c;NavigateUri属性指定单击后导航页面的Uri 若导航到网页&#xff0c;必须同时指定TargetName&#xff0c;否则要报错。 <HyperlinkButton Width"200" Heigh…

江湖又现中科大少年班的传说

作者 | ——&#xff0c;夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;近日&#xff0c;《日本经济新闻》的一则报道指出&#xff1a;在左右着企业、国家和地区发展的人工智能领域&#xff0c;中科大少年班的人才支撑着中国的发展。中国自动驾…

[JOISC2014]バス通学

[JOISC2014]バス通学 题目大意&#xff1a; 有\(n(n\le10^5)\)个点和\(m(m\le3\times10^5)\)条交通线路。第\(i\)条交通线路可以让你在时间\(x_i\)从\(a_i\)出发&#xff0c;并在\(y_i\)时到达\(b_i\)。\(q(q\le10^5)\)次询问&#xff0c;每次询问若要在时间\(l_i\)到达\(n\)点…

Windows7在Notepad++中配置Python+OpenCV

1、 从http://notepad-plus-plus.org/下载最新的Notepad6.2.1安装&#xff1b; 2、 从http://www.python.org/下载python-2.7.3.msi安装到D:\Python27目录下&#xff0c;并将D:\Python27添加到环境变量Path中&#xff1b; 3、 打开Notepad&#xff0c;按下F5或者运行(R…

virtualenv 在windows下的绿化方法

virtualenv 在windows下的绿化方法测试环境&#xff1a;windows 7 32 en Python 2.7.3setuptools-0.6c11.win32-py2.7virtualenv-1.9.1-with-pip-1.3.11. f:\> virtualenv my2. 编辑 my/Scripts/activate.bat 前几行中设置VIRTUAL_ENV的那条语句&#xff0c;改为set VIRTUA…

当谈论迭代器时,我谈些什么?

作者 | 樱雨楼编辑 | 豌豆花下猫转载自python猫&#xff08;ID:python_cat&#xff09;导语&#xff1a;之前说过&#xff0c;我对于编程语言跟其它学科的融合非常感兴趣&#xff0c;但我还说漏了一点&#xff0c;就是我对于 Python 跟其它编程语言的对比学习&#xff0c;也很感…

Windows7在Eclipse中配置Python+OpenCV

1. 从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-windows-i586.exe&#xff0c;安装到D:\ProgramFiles\Java&#xff0c;并将D:\ProgramFiles\Java\jdk1.7.0_02\bin添加到环境变量中&#xff1b; 2. 从…

Pinterest基于AWS规模化使用Apache Kafka的实践经验

在Pinterest&#xff0c;Apache Kafka被用于为实时流应用程序传输数据、记录日志和可视化监控指标。Pinterest的Kafka托管在AWS上&#xff0c;为了实现复制和高可用性&#xff0c;其安装使用了MirrorMaker和DoctorKafka工具。 Pinterest的技术主管Yu Yang写道&#xff0c;Pinte…

Open×××以及其它IP层×××的完全链路层处理的实现

如果Open也能实现传输模式该有多好&#xff0c;如果基于Open实现的产品能仅仅作为一根昂贵的网线串接在用户网络环境&#xff0c;自动捕获感兴趣流量该有多好&#xff1b;如果它能做到只需要配置一个IP即可工作而无需配置任何路由该有多好。我们知道Open是一个用户态的程序&…

Windows 7 64位机上OpenCV2.4.3的编译、安装与配置

1. 从http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.3/下载OpenCV2.4.3&#xff1b; 2. 将OpenCV-2.4.3.exe放到D:\soft\OpenCV2.4.3文件夹下&#xff0c;解压到当前文件夹下&#xff0c;生成一个opencv文件夹&#xff1b; 3. 下载并安…

有望替代卷积神经网络?微软最新研究提基于关系网络的视觉建模

导语&#xff1a;最近两年&#xff0c;自注意力机制、图和关系网络等模型在NLP领域刮起了一阵旋风&#xff0c;基于这些模型的Transformer、BERT、MASS等框架已逐渐成为NLP的主流方法。这些模型在计算机视觉领域是否能同样有用呢&#xff1f;近日&#xff0c;微软亚洲研究院视觉…

Word 2013无法发布文章到博客园

2018年12月12日突然发现word2013无法发布文章到博客园了&#xff0c; 虽然不常发布博客&#xff0c; 但作为一个强迫症患者&#xff0c; 不折腾好了&#xff0c; 吃肉都不香呀&#xff01; 删除之前的账户&#xff0c; 想重新注册&#xff0c; 居然遇到了灰色对话框&#xff01…

1 sec on Large Judge (java): https://github.com/l...

1 sec on Large Judge (java): https://github.com/leoyonn/leetcode/blob/master/src/q029_substring_of_all_words/Solution.java转载于:https://www.cnblogs.com/codingtmd/archive/2013/03/31/5079017.html

性能提升3倍的树莓派4,被爆设计缺陷!

整理 | 屠敏转载自CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;一直以来&#xff0c;素有世界最小电脑之称的 Raspberry Pi&#xff08;树莓派&#xff09;是一种独特的存在。它不仅只有一块信用卡般的体积&#xff0c;还具备主机电脑所具备的功能&#xff0c;如运行 L…

Windows7 64位机上Emgu CV2.4.2安装与配置

1. 从http://sourceforge.net/projects/emgucv/?sourcedirectory下载最新的Emgu CV2.4.2&#xff1b; 2. 将libemgucv-windows-x86-gpu-2.4.2.1777拷贝到D:\soft\Emgu2.4.2文件夹下&#xff0c;运行此.exe文件&#xff0c;将其安装到D:\soft\Emgu2.4.2\emgucv-wind…

2018年12月,华为HCNP大面积更新题目,军哥独家解题咯

2018年12月&#xff0c;华为HCNP大面积更新题目&#xff0c;乾颐堂军哥独家解题咯2018年是华为认证变动比较大的一年&#xff0c;华为认证走过这几年不得不说是有一定进步的&#xff0c;而且最近华为孟女侠确实让我也小小的骄傲了一把&#xff0c;所以当然希望华为认证能做的更…

关于ProGuard的学习了解(从别处转来)

from&#xff1a;http://www.cnitblog.com/zouzheng/archive/2011/01/12/72639.html在Android项目中用到JNI&#xff0c;当用了proguard后&#xff0c;发现native方法找不到很多变量&#xff0c;原来是被produard优化掉了。所以&#xff0c;在JNI应用中该慎用progurad啊。解决办…

tesseract-ocr3.02字符识别过程操作步骤

1、 从http://code.google.com/p/tesseract-ocr/downloads/list下载tesseract-ocr-3.02-vs2008、tesseract-ocr-3.02.chi_sim.tar、tesseract-ocr-3.02.02.tar、tesseract-ocr-3.02.02-doc-html.tar、leptonica-1.68-win32-lib-include-dirs相关文件&#xff1b; 2、 将所有…

中文repo“霸榜”GitHub Trending,国外开发者不开心了

编译整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;一位叫Balazs Saros 的国外开发者在Medium上发表了一篇名为"Chinese repos are ruining the Github trending page"的博文&#xff0c;翻译一下他的意思就是“中文 repo 正在…

使用 electron-updater 自动更新应用

前端工程师可以使用 Electron 非常方便的编写出 PC 端应用&#xff0c;而应用更新的方式也有很多&#xff0c;详细可见更新应用程序。 我的项目是基于 electron-vue 搭建的&#xff0c;构建打包生成安装包&#xff0c;则用的是 electron-builder&#xff0c;所以更新自然选择 e…

struts2请求处理过程源代码分析(1)

2019独角兽企业重金招聘Python工程师标准>>> 转载自&#xff1a;http://www.see-source.com/ 源码解析网 网上对于struts2请求处理流程的讲解还是比较多的&#xff0c;有的还是非常详细的&#xff0c;所以这里我就简单地将大概流程总结下&#xff0c;有了个大概印象…

Ubuntu中C代码静态检查工具Splint的安装配置和使用

1、 从http://www.splint.org/download.html下载splint-3.1.2.src.tgz&#xff0c;存放到/home/spring/Splint文件夹下&#xff1b; 2、 打开终端&#xff1b; 3、 解压缩&#xff1a;tar zxvfsplint-3.1.2.src.tgz 4、 安装到/usr/local/splint目录下&#xff1a; …

Fetch 入门

一、什么是Fetch &#xff1f; Fetch的定义 Fetch本质上是一种标准&#xff0c;该标准定义了请求、响应和绑定的流程。 Fetch标准还定义了Fetch () JavaScript API&#xff0c;它在相当低的抽象级别上公开了大部分网络功能&#xff0c;我们今天讲的主要是Fetch API。Fetch API …