cvPutText opencv中汉字的输出

合集下载

c语言printf打印汉字的用法

c语言printf打印汉字的用法

c语言printf打印汉字的用法C语言中使用printf函数打印汉字的用法
在C语言中,我们可以使用printf函数来打印输出汉字。

下面是使用printf函
数打印汉字的简单示例:
1. 首先,确保你的代码文件以UTF-8编码保存,以支持汉字字符的输入和输出。

2. 使用"%s"格式化说明符打印字符串时,需要将汉字字符保存在一个字符数组中,确保数组的大小足够容纳汉字字符。

3. 示例代码如下所示:
```c
#include <stdio.h>
int main() {
char chinese[] = "你好,世界!"; // 包含汉字的字符数组
printf("%s\n", chinese); // 使用"%s"格式化说明符打印汉字
return 0;
}
```
在上面的示例中,我们定义了一个名为chinese的字符数组,其中保存了一个
包含汉字的字符串。

然后,我们使用printf函数和"%s"格式化说明符来打印这个字
符数组。

注意事项:
- 请确保正确设置你的编译环境以支持UTF-8编码和打印汉字。

- 如果你在终端中输出乱码,请检查终端的字符编码设置是否为UTF-8。

- 在一些特殊情况下(例如Windows的命令行窗口),可能需要使用特殊函数或库来支持汉字的打印,请参考相关文档和资料进行调整。

通过上述示例,你可以在C语言中使用printf函数打印汉字。

记住适当设置编码和环境参数,以确保正确打印和显示汉字字符。

PythonOpenCV实现图片上输出中文

PythonOpenCV实现图片上输出中文

PythonOpenCV实现图⽚上输出中⽂OpenCV中在图⽚上输出中⽂⼀般需要借助FreeType库实现。

FreeType库是⼀个完全免费(开源)的、⾼质量的且可移植的字体引擎,它提供统⼀的接⼝来访问多种字体格式⽂件。

但使⽤FreeType需要下载库并重新编译,过程⿇烦⼀点。

在Python中,可以借助PIL(Python Imaging Library)模块实现,相对简单很多,需要做的只是对图像进⾏OpenCV格式和PIL格式的相互转换。

# -*- coding: utf-8 -*-import cv2import numpyfrom PIL import Image, ImageDraw, ImageFontif __name__ == '__main__':img_OpenCV = cv2.imread('01.jpg')# 图像从OpenCV格式转换成PIL格式img_PIL = Image.fromarray(cv2.cvtColor(img_OpenCV, cv2.COLOR_BGR2RGB))# 字体字体*.ttc的存放路径⼀般是: /usr/share/fonts/opentype/noto/ 查找指令locate *.ttcfont = ImageFont.truetype('NotoSansCJK-Black.ttc', 40)# 字体颜⾊fillColor = (255,0,0)# ⽂字输出位置position = (100,100)# 输出内容str = '在图⽚上输出中⽂'# 需要先把输出的中⽂字符转换成Unicode编码形式if not isinstance(str, unicode):str = str.decode('utf8')draw = ImageDraw.Draw(img_PIL)draw.text(position, str, font=font, fill=fillColor)# 使⽤PIL中的save⽅法保存图⽚到本地# img_PIL.save('02.jpg', 'jpeg')# 转换回OpenCV格式img_OpenCV = cv2.cvtColor(numpy.asarray(img_PIL),cv2.COLOR_RGB2BGR)cv2.imshow("print chinese to image",img_OpenCV)cv2.waitKey()cv2.imwrite('03.jpg',img_OpenCV)输出效果:字体 *.ttc的存放路径⼀般是: /usr/share/fonts/opentype/noto/可以使⽤locate指令查找本机上已经下载的字体:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

OpenCv-freetype模块的编译(支持中文输出到图片)

OpenCv-freetype模块的编译(支持中文输出到图片)

OpenCv-freetype模块的编译(⽀持中⽂输出到图⽚)opencv的函数putText⽆法正确显⽰中⽂。

⽤freetype模块可以加载字体,⽀持中⽂显⽰。

在opencv-contrib⾥模块有freetype,但是在window系统⾥直接⽤cmake编译,⽆法显⽰出freetype模块。

⽹上查询资料好多都在MAC和Linux上配置。

查询了内外⽹,终于找到⽅法,可以在Window上编译通过。

朋友们,如果没有编译成功,评论我把编译好的共享。

1.编译安装freetype下载地址:默认Configure,Generate,OpenProject. 需要⽣成Debug和Release. 记得ALL_BUILD后INSTALL.系统变量添加变量FREETYPE_DIR,⽬录为C:/Program Files/freetype2.编译安装harfbuzz仓库地址:初次Configure后,钩选HB_HAVE_FREETYE,再次Configure.设置好如下值系统变量添加变量HARFBUZZ_DIR,⽬录为C:/Program Files/harfbuzz3.修改modules/freetype/CMakeLists.txt替换如下内容set(the_description "FreeType module. It enables to draw strings with outlines and mono-bitmaps/gray-bitmaps.")find_package(Freetype REQUIRED)# find_package(HarfBuzz) is not included in cmakeset(HARFBUZZ_DIR "$ENV{HARFBUZZ_DIR}" CACHE PATH "HarfBuzz directory")find_path(HARFBUZZ_INCLUDE_DIRSNAMES hb-ft.h PATH_SUFFIXES harfbuzzHINTS ${HARFBUZZ_DIR}/include)find_library(HARFBUZZ_LIBRARIESNAMES harfbuzzHINTS ${HARFBUZZ_DIR}/lib)find_package_handle_standard_args(HARFBUZZDEFAULT_MSG HARFBUZZ_LIBRARIES HARFBUZZ_INCLUDE_DIRS)if(NOT FREETYPE_FOUND)message(STATUS "freetype2: NO")else()message(STATUS "freetype2: YES")endif()if(NOT HARFBUZZ_FOUND)message(STATUS "harfbuzz: NO")else()message(STATUS "harfbuzz: YES")endif()if(FREETYPE_FOUND AND HARFBUZZ_FOUND)ocv_define_module(freetype opencv_core opencv_imgproc PRIVATE_REQUIRED ${FREETYPE_LIBRARIES} ${HARFBUZZ_LIBRARIES} WRAP python) ocv_include_directories(${FREETYPE_INCLUDE_DIRS} ${HARFBUZZ_INCLUDE_DIRS})else()ocv_module_disable(freetype)endif()4.编译安装OpenCv初次Configure后,选择contrib模块路径,同时把模块集合在opencv_world上,可以如下勾选。

opencv-putText绘字

opencv-putText绘字

opencv-putText绘字 cv::Mat src(500, 500, CV_8UC3, cv::Scalar(0,0,0));std::string text = "Hello World!";cv::putText(src,text, cv::Point(10,50), cv::FONT_HERSHEY_PLAIN,4, cv::Scalar(255,0,0),3);/*参数1:待绘制的图像参数2:待绘制的⽂字参数3:⽂本框的左下⾓参数4:字体⽀持的字体见下图参数5:尺⼨因⼦,值越⼤⽂字越⼤参数6:线条的颜⾊参数7:线条宽度参数8:线型(4邻域或8邻域,默认8邻域)参数9:bool bottomLeftOrigin = false // true='origin at lower left'*/cv::imshow("src", src);cv::Mat src(500, 500, CV_8UC3, cv::Scalar(255,0,0));std::string text = "Hello World!";int baseline;cv::Size text_size = cv::getTextSize(text, 3, 2, 2, &baseline);//获取⽂本框的长宽/*参数1:待绘制的⽂字参数2: int fontFace: ⽂字字体类型参数3:double fontScale: 字体缩放系数参数4:int thickness: 字体笔画线宽参数5:CV_OUT int* baseLine: ⽂字最底部y坐标*/cv::putText(src, text, cv::Point(10, 50), 3, 2, cv::Scalar(0, 255, 255), 2, 8, 0);std::cerr << text_size << std::endl;std::cerr << baseline << std::endl;cv::imshow("src", src);绘制中⽂解压后把两个⽂件复制到⼯程中添加头⽂件和源⽂件导⼊头⽂件:#include "puttextzh.h"cv::Mat src(500, 500, CV_8UC3, cv::Scalar(0,0,0));putTextZH(src, "欢迎你使⽤中⽂", cv::Point(10,50), cv::Scalar(255,0,0),30, "⿊体", true,true);/*参数1:待绘制的图像参数2:待绘制的⽂字参数3:⽂本框的左下⾓参数4:字体颜⾊参数5:字体⼤⼩,值越⼤⽂字越⼤参数6:字体(默认使⽤Arial字体,也可以设置成操作系统中已经安装的字体,如“宋体”、“微软雅⿊”、“Times New Roman”等;默认显⽰⾮斜体、⾮下划线)参数7:是否斜体参数8:是否有下划线*/cv::imshow("src", src);。

opencv 图像上添加文字

opencv 图像上添加文字

openCV字体和文字cvFont最后一种形式的绘图是绘制文字。

当然,文字创建了一套自己的复杂格式,但是,在这类事情上,OpenCV一如既往地更关心提供一个简单的"一招解决问题"的方案,这个方案只适用于一些简单应用,而不适用于一个稳定的和完整的应用(这将降低由其他库提供的功能)。

OpenCV有一个主要的函数,叫cvPutText()。

这个函数可以在图像上输出一些文本。

参数text所指向的文本将打印到图像上,参数origin指定文本框左下角位置,参数color指定文本颜色。

1.void cvPutText(2. CvArr* img,3. const char* text,4. CvPoint origin,5. const CvFont* font,6.7. CvScalar color8.);概括地说,获取CvFont*指针的方式就是调用函数cvInitFont()。

该函数采用一组参数配置一些用于屏幕输出的基本个特定字体。

如果熟悉其他环境中的GUI编程,势必会觉得cvInitFont似曾相识,但只需更少的参数。

为了建立一个可以传值给cvPutText()的CvFont,首先必须声明一个CvFont变量,然后把它传递给cvInitFont()。

1.void cvInitFont(2. CvFont* font,3. int font_face,4. double hscale,5. double vscale,6. double shear = 0,7. int thickness = 1,8. int line_type = 89.);观察本函数与其他相似函数的不同。

正如工作在OpenCV环境下的cvCreateImage()。

调用cvInitFont()时,初始化一个已经准备好的CvFont结构(这意味着你创建了一个变量,并传给cvInitFont()函数一个指向新建的变量指针),而不是像cvCreateImage()那样创建一个结构并返回指针。

cvPutText opencv中汉字的输出

cvPutText opencv中汉字的输出

cvPutText opencv中汉字的输出OPENCV 不支持汉字输出,但可以修改其代码,支持汉字。

字符输出在nitFont、cvPutText、cvGetSize三个函数中,文件在cxcore\src\cxdrawing.cpp函数介绍:void cvlnitFont(CvFont*font,int font_face,double hscale,double vscale,double shear,int thickness,int line_type);/*font表示被初始化的字体结构体。

font_face字体名称标识符,目前仅支持CV_FONT_HERSHEY_SIMPLEX等少数几种字体。

hscale表示字体宽度的放大系数,例如0.5f表示宽度为原来的一半,shear字体豹裁瘦的斜率,1表示字体倾斜45度。

thickness表示字体笔划的粗细程度。

line_type表示字体笔划的类型,具体参见cvLine。

*/void cvPutText(CvArr *img,char+text,CvPoint org,CvFont *font,CvScalar color);/*img表示图像。

这里要严格的ASCII字符,不能接受像GB2312等双字节编码。

org表示第1个字符左下角的坐标。

font表示字体结构体。

color表示文本的字体颜色。

*/字符编码:ASCII(一个字节),GB2313(两个字节),Unicode(两个字节).unicode兼容ASCII,不兼容GB,需要ANSI-C语言来转换.思想如下:1,解析汉字的编码;2,根据汉字编码装载汉字的形状;3,输出汉字的形状。

1,从char --> wchar_t2,采用TrueType 字库。

利用开源的FreeType库来处理字库。

具体如下:用FreeType的API提取一个字符的过程如下:{FT_Library m_library;//字库FT_Face m face;//字体//打开字库文件,创建一个字体FT_Init_FreeType(&m_library);FT_New_Face(m_library,"TrueType.ttf,0,&m_face);∥根据字符的编码得到字符的索引位置//根据字符在字库中索引得到字库轮廓//根据字符的轮廓渲染字符的二值位图FT_UInt glyph_index=FT_Get_Char_Index(m_face,'中');FT_Load_Glyph(m_face,glyph_index,FT_LOAD_DEFAULT);FT_RenderGlyph(m_face->glyph,FT_RENDER_MODE_MONO);//释放FreeType库管理的资源FT_Done_Face(m_face);FT_Done_FreeType(m_library);}3, 显示字型对应的是字型的位图(m_face->glyph->bitmap),直接把字符对应的位图像素绘制到影像中即可。

c++ opencv freetype 中文文本

c++ opencv freetype 中文文本

c++ opencv freetype 中文文本OpenCV是一个开源计算机视觉库,提供了丰富的图像处理和计算机视觉算法。

而FreeType则是一种开源的字体渲染引擎,用于将字体数据转换为高质量的位图。

结合这两个工具,我们可以在C++中使用OpenCV和FreeType来渲染中文文本。

要在OpenCV中渲染中文文本,需要以下几个步骤:1.安装OpenCV和FreeType库:首先,需要在计算机上安装OpenCV和FreeType库。

可以从官方网站下载并按照安装说明进行安装。

2.加载字体文件:为了渲染中文文本,首先需要加载一个中文字体文件。

可以从各种资源获取中文字体文件,然后通过FreeType库加载到内存中。

```C++FT_Library ft;FT_Face face;//初始化FreeType库FT_Init_FreeType(&ft);//加载字体文件FT_New_Face(ft, "font.ttf", 0, &face);```3.设置字体参数:在渲染之前,可以设置一些字体的参数,如字号、加粗、斜体等。

```C++//设置字号和DPIFT_Set_Char_Size(face, 0, 20 * 64, 72, 72);//设置字体参数FT_Set_Pixel_Sizes(face, 0, 40);face->style_flags |= FT_STYLE_FLAG_BOLD;```4.渲染文本:接下来,可以使用FreeType库将中文文本渲染到OpenCV的图像中。

渲染过程通常包括计算字符的字形、度量字形的尺寸、生成字形位图等步骤。

```C++//设置渲染参数FT_Load_Char(face, '中', FT_LOAD_RENDER);FT_GlyphSlot g = face->glyph;FT_Bitmap bitmap = g->bitmap;//创建OpenCV图像cv::Mat image(bitmap.rows, bitmap.width, CV_8UC1, bitmap.buffer);//渲染字符到图像cv::imshow("Rendered Text", image);```以上是一个简单的使用OpenCV和FreeType库渲染中文文本的示例。

OpenCV-文字绘制cv::putText

OpenCV-文字绘制cv::putText

OpenCV-文字绘制cv::putText作者:翟天保Steven版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处函数原型void putText( InputOutputArray img, const String& text, Point org,int fontFace, double fontScale, Scalar color,int thickness = 1, int lineType = LINE_8,bool bottomLeftOrigin = false );参数说明1.InputOutputArray类型的img,输入图像也是输出图像,如Mat类型。

2.const String&类型的text,所要绘制的文字。

3.Point类型的org,文字的位置,第一个数值表示文字最左侧的位置,第二个数值表示文字居中线距离图像的长度。

4.int类型的fontFace,文字字体,我最喜欢的是FONT_HERSHEY_SCRIPT_SIMPLEX,手写体。

5.double类型的fontScale,文字大小。

6.Scalar类型的color,文字颜色。

7.int类型的thickness,文字线条宽度。

8.int类型的line_type,绘制线的类型,-1就是FILLED(填满),4是LINE_4(4连通域),8是LINE_8(8连通域),LINE_AA(抗锯齿线)。

9.bool类型的bottomLeftOrigin,标识原点位置,若为true,则表示图像左下角为原点,OpenCV中原点位置一般为左上角。

测试代码#include <iostream>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;int main(){cv::Mat src = imread("girl.jpg");cv::Mat result = src.clone();cv::putText(result, "Angel", cv::Point(0, 500), FONT_HERSHEY_SCRIPT_SIMPLEX, 20, cv::Scalar(255, 255, 0), 20, 16);imshow("original", src);imshow("result", result);waitKey(0);return 0;}测试效果图1 原图图2 文字y方向距离示意图图3 效果图文本绘制还是经常用到的,不过OpenCV默认只能绘制英文或数字,中文只能采用其他方式绘制,比如freetype开源库,或者用window库自带的一些函数写,但是这些一般都只能绘制在3通道8位图中,比如CV_8UC3;像我经常处理的图像都是CV_32FC1,float类型,就只能用putT ext,没有现成的绘制中文的库,后期有时间可能会研究研究写一个~如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

cvPutText opencv中汉字的输出
OPENCV 不支持汉字输出,但可以修改其代码,支持汉字。

字符输出在nitFont、cvPutText、cvGetSize三个函数中,文件在cxcore\src\cxdrawing.cpp
函数介绍:
void cvlnitFont(CvFont*font,int font_face,double hscale,double vscale,double shear,int thickness,int line_type);
/*font表示被初始化的字体结构体。

font_face字体名称标识符,目前仅支持CV_FONT_HERSHEY_SIMPLEX等少数几种字体。

hscale表示字体宽度的放大系数,例如0.5f表示宽度为原来的一半,shear字体豹裁瘦的斜率,1表示字体倾斜45度。

thickness表示字体笔划的粗细程度。

line_type表示字体笔划的类型,具体参见cvLine。

*/
void cvPutText(CvArr *img,char+text,CvPoint org,CvFont *font,CvScalar color);
/*img表示图像。

这里要严格的ASCII字符,不能接受像GB2312等双字节编码。

org表示第1个字符左下角的坐标。

font表示字体结构体。

color表示文本的字体颜色。

*/
字符编码:ASCII(一个字节),GB2313(两个字节),Unicode(两个字节).unicode兼容ASCII,不兼容GB,需要ANSI-C语言来转换.
思想如下:
1,解析汉字的编码;2,根据汉字编码装载汉字的形状;3,输出汉字的形状。

1,从char --> wchar_t
2,采用TrueType 字库。

利用开源的FreeType库来处理字库。

具体如下:
用FreeType的API提取一个字符的过程如下:{
FT_Library m_library;//字库
FT_Face m face;//字体
//打开字库文件,创建一个字体
FT_Init_FreeType(&m_library);
FT_New_Face(m_library,"TrueType.ttf,0,&m_face);
∥根据字符的编码得到字符的索引位置
//根据字符在字库中索引得到字库轮廓
//根据字符的轮廓渲染字符的二值位图
FT_UInt glyph_index=FT_Get_Char_Index(m_face,'中');
FT_Load_Glyph(m_face,glyph_index,FT_LOAD_DEFAULT);
FT_RenderGlyph(m_face->glyph,FT_RENDER_MODE_MONO);
//释放FreeType库管理的资源
FT_Done_Face(m_face);
FT_Done_FreeType(m_library);
}
3, 显示
字型对应的是字型的位图(m_face->glyph->bitmap),直接把字符对应的位图像素绘制到影像中即可。

影像中每个像素的颜色可以通过OpenCV中的cvSet2D函数设置。

实现代码如下:
void drawCharaeter(Ipllmage *image,FT_Face *face)
{
//处理Ipllmage影像的origin标志和ROI结构
yphSIot slot=m_face->gly
FT_GlyphSiot slot = m_face->glyph;
int rows=slot->bitmap.rows;
int cols=slot->bitmap.width;
for(int i=0;i<rows;++i){
for(intj=o;j<cols;++j){
int off=i*slot->bitmap.pitch+j/8;
int flag=slot->bitmap[off]&(0xc0>>(j%8));
cvSet2D(img,i,j,CV_RGB(255,255,255));
}。

相关文档
最新文档