日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV实现在图像中写入汉字

發布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);
}


總結

以上是生活随笔為你收集整理的OpenCV实现在图像中写入汉字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:OpenCV实现在图像中写入汉字