由于一个小项目的需要,我得在把1000多个账号粘贴到特定的图片上打印出来,简直可怕。
系统 : windows7
环境 : vs2010+opencv-2.4.0
opencv+vs配置
这个就不多说什么了
(1)配置系统变量
(2)添加包含目录、库目录
(3)添加附加依赖项(.lib)
有疑问可以参考:
http://www.cnblogs.com/freedomshe/archive/2012/04/25/2470540.html
简单粗暴。
freeType+opencv+vs:编译、整合与配置
其实如果输入的账号仅仅只是数字跟字母的话,用opencv自带的putText就已经能够满足了。
Mat mid=imread(add+"\\"+tailOfPrefix[i]);
for(int j=1;j<=numOfCollect;++j)
{
Mat copy=mid.clone();
sprintf(suffix,"%04d",j);
string no=prefix+string(suffix);
Point siteNo;
siteNo.x = 370;
siteNo.y = 1080;
putText( copy, no, siteNo, 4,2.5,Scalar( 0, 0, 0 ), 4);
rectangle( copy,
Point( 1250, 980 ),
Point( 2500, 1150),
Scalar( 255, 255, 255 ),
-1,
8 );
imwrite(result+"\\"+no+tailOfPrefix[i],copy);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
但是由于部分账号的非法性,我得给出中文提示。于是乱码了。。。????
网上搜了一发,发现FreeType可以解决我们的问题。
FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件
准备工作:
FreeType库:
下载地址:http://sourceforge.net/projects/freetype/files/freetype2/
中文字体:
直接从自己电脑C:\Windows\Fonts\下面拿一个自己喜欢的即可。(simhei.ttf)
编译得到两个之后会被调用的lib库:
freetype262.lib与freetype262d.lib。
用vs2010打开下载的库文件下的目录文件builds\windows\vc2010\freetype.sln解决方案(与vs版本对应),在Debug模式下编译,待编译完毕;再切到Release模式下,如果编译中出现错误,不要理会。此时在目录objs\vc2010\Win32下已生成了两个lib。
整合opencv跟freetype:
将之前编译生成的freetype262.lib与freetype262d.lib。将这两个lib库复制到自己安装opencv的opencv\build\x86\vc10\lib文件夹下。
在opencv\build\include下新建文件夹freetype,将freetype根目录下的include文件夹跟lib文件夹拷贝到此文件夹下。
配置程序:
工程demo中须添加的代码和资源
添加头文件
CvxText.h:
#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>
/**
* \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
{
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
添加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();
setlocale(LC_ALL, "");
}
CvxText::~CvxText()
{
FT_Done_Face (m_face);
FT_Done_FreeType(m_library);
}
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;
}
FT_Set_Pixel_Sizes(m_face, (int)m_fontSize.val[0], 0);
}
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;
}
void CvxText::putWChar(IplImage *img, wchar_t wc, CvPoint &pos, CvScalar color)
{
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);
}
}
}
}
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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
然后我们在VS中添加FreeType头文件的路径:
添加库文件的路径:
这里可能有些小伙伴注意到我用的是opencv的staticLib,这里小伙伴只需要把那两个编译出来的lib库放到同目录下的staticLib文件夹中即可。我们先继续往下走。
添加链接库名称:
最后将字体文件也放入到工程目录下。
Mat mid=imread(add+"\\"+tailOfPrefix[i]);
for(int j=1;j<=numOfCollect;++j)
{
Mat copy=mid.clone();
sprintf(suffix,"%04d",j);
string no=prefix+string(suffix);
Point siteNo;
siteNo.x = 370;
siteNo.y = 1080;
putText( copy, no, siteNo, 4,
2.5,Scalar( 0, 0, 0 ), 4);
rectangle( copy,
Point( 1250, 980 ),
Point( 2500, 1150),
Scalar( 255, 255, 255 ),
-1,
8 );
float p=1;
CvScalar a=cvScalar(60,0.5,0.1,0);
text.setFont(NULL,&a, NULL, &p);
IplImage *src;
src=&IplImage(copy);
text.putText(src,mmOfCollect, cvPoint(1580, 1070), CV_RGB(0,0,0));
imwrite(result+"\\"+no+tailOfPrefix[i],copy);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26