說明:本博文是根據前人已有的成果並結合自己的理解而成的。為了避免讓讀者感到繁瑣,我將運用小學及初中學習的總分總、承上啟下的寫作技巧進行講解,力圖做到詳略有致,言簡意賅,圖文並茂,通俗易懂。
實驗平台:VS2010 + opencv2.4.10 (其他版本搭配也是一樣的做法)
簡介:在opencv中,不可避免的會遇到在一幅圖像、一段視頻或者實時的監控畫面上嵌入特定的文字來標識,讓人一目了然。那么怎么利用opencv在這些對象上嵌入英文或者是漢字呢?下面切入正題,就嵌入英文和中文字符2個部分,分別做闡述。
一、嵌入英文字符(opencv自帶函數)
這一部分比較簡單,利用opencv自帶的cvInitFont()和cvPutText()函數就可以了。【具體使用方法請百度,這里不做詳細說明】
直接放上演示代碼和效果圖。
demo1源碼:
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
int main(void)
{
IplImage *img = cvLoadImage("wall.jpg");
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_DUPLEX, 1, 1, 0, 2, 4);
cvPutText(img, "This is demo 1.", cvPoint(200, 65), &font, CV_RGB(255, 0, 0));
cvPutText(img, "http://blog.csdn.net/hujingshuang", cvPoint(20, 125), &font, CV_RGB(255, 0, 0));
cvNamedWindow("demo1:圖片嵌入字符", CV_WINDOW_AUTOSIZE);
cvShowImage("demo1:圖片嵌入字符", img);
cvWaitKey(0);
cvDestroyWindow("demo1:圖片嵌入字符");
return 0;
}
demo1效果圖:
. 
二、嵌入中文字符(FreeType)
這一部分比較麻煩,但只需按照下面的步驟一步一步來就行,為方便敘述,我以自己的opencv安裝目錄為例(D:\opencv),請讀者根據自己的目錄操作。
1、首先,下載兩個文件。
①FreeType(版本隨意):我用的是freetype-2.5.5,下載地址:http://sourceforge.net/projects/freetype/files/freetype2/
②simhei.ttf字體工具:如果你的C:\Windows\Fonts\目錄下有,就不用下載。【一般情況下都有】
2、其次,需要兩個lib庫支持。即:freetype255.lib與freetype255d.lib,需要由自己編譯得到。用vs2010打開..\freetype-2.5.5\builds\windows\vc2010\freetype.sln解決方案(與vs版本對應),在Debug模式下按F5編譯,待編譯完畢;再切到Release模式下F5,如果編譯中出現錯誤,不要理會。此時在目錄freetype-2.5.5\objs\vc2010\Win32下已生成了兩個lib,將其復制到D:\opencv\build\x86\vc10\lib文件夾下。
3、在D:\opencv\build\include下新建文件夾freetype,將..\freetype-2.5.5\下的include和src,以及CvxText.cpp、CvxText.h、stdafx.cpp、stdafx.h、targetver.h拷貝到此文件夾下,至此繁瑣的工作已做完。【此處說明:需要修改CvxText.cpp文件,即:在CvxText.cpp文件首行添加#include”stdafx.h”,在函數setFont末尾加入FT_Set_Pixel_Sizes(m_face, (int)m_fontSize.val[0], 0)語句,附件包中已做了修改】
.

4、下面新建一個空項目,將CvxText.cpp拷到項目目錄下,並添加到ResourceFiles,接下來就很簡單了。
.
在項目屬性里添加include路徑:

再添加lib路徑:D:\opencv\build\x86\vc10\lib
.

在Linker—>Input中增加依賴項:freetype255d.lib、freetype255.lib
.
這樣配置就完成了,接下來就是代碼和效果圖:
demo2源碼:
#include<iostream>
#include<stdlib.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv/CvxText.h>
int main(void)
{
IplImage *img = cvLoadImage("wall.jpg");
CvxText text("C:\\WINDOWS\\Fonts\\simhei.ttf");//此目錄下有很多tff格式文件,有興趣可一一實驗,選擇最喜歡的字體。
float p = 1;
text.setFont(NULL, NULL, NULL, &p); // 透明處理
text.putText(img, "demo2:圖片嵌入中文字符", cvPoint(180, 65), CV_RGB(0,0,255));
text.putText(img, "參見博客:http://blog.csdn.net/hujingshuang", cvPoint(120, 110), CV_RGB(0,0,255));
cvNamedWindow("demo2:圖片嵌入中文字符", CV_WINDOW_AUTOSIZE);
cvShowImage("demo2:圖片嵌入中文字符", img);
cvWaitKey(0);
cvDestroyWindow("demo2:圖片嵌入中文字符");
return 0;
}
demo2效果圖:
. 
至此,利用opencv在圖像中嵌入中英文字符已講解完畢。由此及彼,便可在視頻中嵌入感興趣的字符。源碼及所有需要的文件都已打包上傳,詳情下載附件:http://download.csdn.net/detail/hujingshuang/8394121
若有疑問,可在博客評論回復,或將問題圖文並茂的郵件給筆者(cuit_hjs@163.com),知識有限,但盡量答復。
特別注意:
1、本博客例程僅做學習交流用,切勿用於商業用途。
2、歡迎交流,轉載請注明出處:http://blog.csdn.net/hujingshuang/article/details/43112237
