DrawText输出Unicode中文时乱码的问题

部署运行你感兴趣的模型镜像

自行设置了字体

ZeroMemory(&m_logFont,sizeof(m_logFont));
    lstrcpy(m_logFont.lfFaceName,_T("黑体"));
    m_logFont.lfHeight = - abs( CUIManager::GetValue(_T("HideItem"),_T("FontSize"), 25) );
    m_logFont.lfWeight = FW_BLACK;
    m_logFont.lfWidth=0;
    m_logFont.lfItalic=FALSE;
    m_logFont.lfOrientation=0;
    m_logFont.lfEscapement=0;
    m_logFont.lfUnderline=FALSE;
    m_logFont.lfStrikeOut=FALSE;
    m_logFont.lfCharSet=ANSI_CHARSET;
    m_logFont.lfOutPrecision=OUT_DEFAULT_PRECIS;
    m_logFont.lfClipPrecision=CLIP_DEFAULT_PRECIS;
    m_logFont.lfQuality=DEFAULT_QUALITY;
    m_logFont.lfPitchAndFamily=FF_MODERN|DEFAULT_PITCH;

    m_font.CreateFontIndirect(&m_logFont);

memDC.DrawText(sText,gripper,DT_CENTER|DT_VCENTER|DT_SINGLELINE);输出乱码

排除字体转换问题,发现黑体改为宋体即可。

lstrcpy(m_logFont.lfFaceName,_T("宋体"));

原因:系统缺乏黑体,造成中文乱码。当必须改字体时,自己安装上即可。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>嗯,用户想在OpenCV中使用putText函数显示中文字符。我之前记得OpenCV的默认putText函数支持中文,直接使用的话会显示乱码或者方块。那用户可能需要用到其他方法。 首先,用户提供的引用里有提到一些方法,比如使用cv2.freetype,但可能没有这个库。或者安装opencv-contrib-python,里面可能包含更多的模块。过用户提到尝试过这些方法但没成功,所以可能需要另一种解决方案。 然后,引用里有一个PutText.h的头文件,里面定义了GetStringSize和putTextZH函数,使用Windows的HDC来绘制文字。这应该是一种通过Windows API来渲染中文的方法,可能适用于C++环境。过用户可能需要Python的示例代码,所以需要考虑如何转换到Python。 在Python中,可能需要使用PIL库来生成中文文本的图像,然后将该图像叠加到OpenCV的帧上。因为PIL支持中文字体,可以正确渲染,然后转换成OpenCV的格式。这样就能绕过putText支持中文问题了。 过用户需要示例代码,所以得写出具体的步骤:导入PIL和OpenCV,创建图像,使用PIL的DrawText写入中文,然后转换成OpenCV的Mat格式。可能还需要处理颜色空间的转换,比如RGB到BGR。 另外,要注意字体文件的路径是否正确,用户需要指定一个中文字体文件,比如simsun.ttc或者微软雅黑。如果没有安装这些字体,可能需要用户自己下载或者指定系统内的字体路径。 总结下来,步骤应该是:使用PIL.Image绘制文本,转换图像为NumPy数组,颜色空间转换,然后合并到OpenCV的图像中。这样就能实现中文显示了。同,提醒用户安装必要的库,比如Pillow和opencv-python。 可能还需要提到其他方法,比如使用opencv-contrib-python中的freetype模块,但需要安装正确的版本。如果用户的环境允许,可以尝试这种方法,但可能存在兼容性问题,所以PIL方法可能更可靠。 最后,检查代码是否正确,确保中文字符会被编码问题影响,比如在Python文件中使用正确的编码声明,或者在字符串前加u前缀(Python2可能需要,但Python3默认unicode)。 所以,最终的解决方案应该是基于PIL和OpenCV的结合,生成中文文本,然后合并到目标图像中。</think>在OpenCV中实现中文字符显示需要通过第三方库辅助,以下是两种常用方法及示例代码: --- ### 方法一:使用PIL库与OpenCV结合(推荐) **原理**:利用PIL库的字体渲染能力生成中文文字图像,再转换为OpenCV的Mat格式 ```python import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont # 创建空白画布 img_opencv = np.zeros((200, 400, 3), dtype=np.uint8) img_pil = Image.fromarray(img_opencv) # 配置中文字体(需系统内有对应字体文件) font_path = "C:/Windows/Fonts/simsun.ttc" # 宋体字体路径 font_size = 24 font = ImageFont.truetype(font_path, font_size) # 在PIL图像上绘制中文 draw = ImageDraw.Draw(img_pil) text = "你好,OpenCV!" position = (50, 80) # 文字起始坐标 color = (255, 0, 0) # BGR颜色:红色 draw.text(position, text, font=font, fill=color) # 转换回OpenCV格式 img_opencv = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR) cv2.imshow("Chinese Text", img_opencv) cv2.waitKey(0) ``` --- ### 方法二:使用OpenCV的freetype模块(需安装扩展包) **环境要求**:需安装`opencv-contrib-python`包 ```python import cv2 import numpy as np # 创建freetype实例 ft = cv2.freetype.createFreeType2() ft.loadFontData(fontFileName='msyh.ttf', # 微软雅黑字体路径 id=0) # 创建空白图像 img = np.zeros((200, 400, 3), dtype=np.uint8) # 绘制中文文本 text = "OpenCV中文显示" position = (50, 100) font_size = 24 color = (0, 0, 255) # BGR颜色:红色 ft.putText(img=img, text=text, org=position, fontHeight=font_size, color=color, thickness=-1, line_type=cv2.LINE_AA, bottomLeftOrigin=True) cv2.imshow("FT Chinese", img) cv2.waitKey(0) ``` --- ### 关键点说明 1. **字体路径**:必须指定系统中存在的TrueType字体文件路径,如`simsun.ttc`(宋体)、`msyh.ttf`(微软雅黑)[^2] 2. **颜色通道**:PIL使用RGB格式,OpenCV使用BGR格式,需通过`cv2.cvtColor`转换 3. **扩展包依赖**:方法二需要安装`opencv-contrib-python`包,且版本需>=3.4.0 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值