opencv的puttext函数显示中文时会乱码,网上搜了很多方法都要调库啥的来解决,感觉有些麻烦,而且文字也有一些锯齿等,效果不是很好。
自己写了个头文件来解决这个问题,代码非常简洁,如下:
putText.h:

#ifndef PUTTEXT_H_
#define PUTTEXT_H_#include <windows.h>
#include <string>
#include <opencv2/opencv.hpp>using namespace cv;void GetStringSize(HDC hDC, const char* str, int* w, int* h);
void putTextZH(Mat &dst, const char* str, Point org, Scalar color, int fontSize,const char *fn = "Arial", bool italic = false, bool underline = false);#endif // PUTTEXT_H_

putText.cpp:

#include "putText.h"void GetStringSize(HDC hDC, const char* str, int* w, int* h)
{SIZE size;GetTextExtentPoint32A(hDC, str, strlen(str), &size);if (w != 0) *w = size.cx;if (h != 0) *h = size.cy;
}void putTextZH(Mat &dst, const char* str, Point org, Scalar color, int fontSize, const char* fn, bool italic, bool underline)
{CV_Assert(dst.data != 0 && (dst.channels() == 1 || dst.channels() == 3));int x, y, r, b;if (org.x > dst.cols || org.y > dst.rows) return;x = org.x < 0 ? -org.x : 0;y = org.y < 0 ? -org.y : 0;LOGFONTA lf;lf.lfHeight = -fontSize;lf.lfWidth = 0;lf.lfEscapement = 0;lf.lfOrientation = 0;lf.lfWeight = 5;lf.lfItalic = italic;   //斜体lf.lfUnderline = underline; //下划线lf.lfStrikeOut = 0;lf.lfCharSet = DEFAULT_CHARSET;lf.lfOutPrecision = 0;lf.lfClipPrecision = 0;lf.lfQuality = PROOF_QUALITY;lf.lfPitchAndFamily = 0;strcpy_s(lf.lfFaceName, fn);HFONT hf = CreateFontIndirectA(&lf);HDC hDC = CreateCompatibleDC(0);HFONT hOldFont = (HFONT)SelectObject(hDC, hf);int strBaseW = 0, strBaseH = 0;int singleRow = 0;char buf[1 << 12];strcpy_s(buf, str);char *bufT[1 << 12];  // 这个用于分隔字符串后剩余的字符,可能会超出。//处理多行{int nnh = 0;int cw, ch;const char* ln = strtok_s(buf, "\n",bufT);while (ln != 0){GetStringSize(hDC, ln, &cw, &ch);strBaseW = max(strBaseW, cw);strBaseH = max(strBaseH, ch);ln = strtok_s(0, "\n",bufT);nnh++;}singleRow = strBaseH;strBaseH *= nnh;}if (org.x + strBaseW < 0 || org.y + strBaseH < 0){SelectObject(hDC, hOldFont);DeleteObject(hf);DeleteObject(hDC);return;}r = org.x + strBaseW > dst.cols ? dst.cols - org.x - 1 : strBaseW - 1;b = org.y + strBaseH > dst.rows ? dst.rows - org.y - 1 : strBaseH - 1;org.x = org.x < 0 ? 0 : org.x;org.y = org.y < 0 ? 0 : org.y;BITMAPINFO bmp = { 0 };BITMAPINFOHEADER& bih = bmp.bmiHeader;int strDrawLineStep = strBaseW * 3 % 4 == 0 ? strBaseW * 3 : (strBaseW * 3 + 4 - ((strBaseW * 3) % 4));bih.biSize = sizeof(BITMAPINFOHEADER);bih.biWidth = strBaseW;bih.biHeight = strBaseH;bih.biPlanes = 1;bih.biBitCount = 24;bih.biCompression = BI_RGB;bih.biSizeImage = strBaseH * strDrawLineStep;bih.biClrUsed = 0;bih.biClrImportant = 0;void* pDibData = 0;HBITMAP hBmp = CreateDIBSection(hDC, &bmp, DIB_RGB_COLORS, &pDibData, 0, 0);CV_Assert(pDibData != 0);HBITMAP hOldBmp = (HBITMAP)SelectObject(hDC, hBmp);//color.val[2], color.val[1], color.val[0]SetTextColor(hDC, RGB(255, 255, 255));SetBkColor(hDC, 0);//SetStretchBltMode(hDC, COLORONCOLOR);strcpy_s(buf, str);const char* ln = strtok_s(buf, "\n",bufT);int outTextY = 0;while (ln != 0){TextOutA(hDC, 0, outTextY, ln, strlen(ln));outTextY += singleRow;ln = strtok_s(0, "\n",bufT);}uchar* dstData = (uchar*)dst.data;int dstStep = dst.step / sizeof(dstData[0]);unsigned char* pImg = (unsigned char*)dst.data + org.x * dst.channels() + org.y * dstStep;unsigned char* pStr = (unsigned char*)pDibData + x * 3;for (int tty = y; tty <= b; ++tty){unsigned char* subImg = pImg + (tty - y) * dstStep;unsigned char* subStr = pStr + (strBaseH - tty - 1) * strDrawLineStep;for (int ttx = x; ttx <= r; ++ttx){for (int n = 0; n < dst.channels(); ++n){double vtxt = subStr[n] / 255.0;int cvv = vtxt * color.val[n] + (1 - vtxt) * subImg[n];subImg[n] = cvv > 255 ? 255 : (cvv < 0 ? 0 : cvv);}subStr += 3;subImg += dst.channels();}}SelectObject(hDC, hOldBmp);SelectObject(hDC, hOldFont);DeleteObject(hf);DeleteObject(hBmp);DeleteDC(hDC);
}

主函数的调用也非常简单:

#include "putText.h"void main()
{Mat img(150,600,CV_8UC3,Scalar(255,255,255));//初始化图像putTextZH(img, "力拔山兮气盖世", Point(30, 30), Scalar(0, 0, 0), 80, "华文行楷");imwrite("1.png", img);imshow("", img);waitKey(0);
}

效果图:

再也不用担心显示中文啦!

OpenCV puttext不调库显示中文相关推荐

  1. Python学习之matplotlib库-显示中文

    目录 一. 直接修改配置文件matplotlibrc 二.在运行的程序中添加代码 (一)matplotlib 动态修改配置 (二)matplotlib 设置自定义字体 matplotlib在绘图时,会 ...

  2. 关于128x64 SH1106的OLED屏幕使用U8g2库显示中文

    关于128x64 SH1106的OLED屏幕使用U8g2库驱动讲解 首先感谢: 1.坛友:知行创意实验室 2. oled 3. u8g2如何显示中文 上面的最先发文讲解了有关SH1106的OLED屏幕 ...

  3. opencv-图像上显示中文

    运行环境: vs2013.opencv3.3.win10-64bit 下载显示中文类: OpenCV默认是不支持显示中文字符的,于是网上有人自己写了一个类实现,只需要下载到自己的代码文件中,添加头文件 ...

  4. Ubuntu下让matplotlib显示中文字体

    文章目录 安装中文字体 显示matplotlib库的字体文件夹 删除matplotlib 的缓存文件(可选) matplotlib中设置字体,显示! 参考文章: https://zodiac911.g ...

  5. OpenCV显示中文汉字,未使用CvxText和FreeType库

    OpenCV显示中文汉字,未使用CvxText和FreeType库 采用windows的GDI显示系统的TrueType字体,没有封装,就两个函数,分成了h和cpp文件,可以自己编辑文件名和函数名,亦 ...

  6. C++ OpenCV【解决putText不能显示中文】

    使用cv::putText写中文字符时输出结果为"??????"......这怎么能忍? python方法中可以将opencv图片转化为PIL,写中文之后再转回opencv格式. ...

  7. jetson nano 在opencv拉流的视频上显示中文汉字(含c++完整源码)

    目录 问题 解决方案 步骤一:生成中文图片 步骤二:中文图片蒙皮到视频帧,形成中文显示效果 问题 在jetson nano这样的嵌入式设备上,用opencv拉流,并在实时视频上面,显示汉字. 关于使用 ...

  8. OpenCV显示中文字体

    01.引言 OpenCV-Python 是一个用来图像处理的 Python 库,但其一般不能在图片上显示中文,否则会乱码.但有些情况下我们必须要显示中文,因此,我们可以使用 PIL 库来写中文,再转换 ...

  9. Ubuntu下使用OpenCV显示中文

    由于Opencv默认不显示中文,所以我们需要通过需要通过一些库来设置OpenCV支持中文显示 源码下载链接:Ubuntu下Opencv显示中文 代码说明 项目需要ft2build.h,它是freety ...

最新文章

  1. 2022 年营销自动化七大趋势前瞻
  2. 微信小程序之scroll-view-导航栏左右滑动
  3. vue中父子组件先后渲染_vue父子组件传值(子传父,非父子组件传值)
  4. leetcode 976. 三角形的最大周长
  5. 用shell脚本一键搭建LNMP环境实战
  6. 深入源码之Commons Logging[转]
  7. 125 个视频成就千万级网红,Python 告诉你李子柒都在拍些什么?
  8. TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:
  9. SpringCloud学习笔记(15)----Spring Cloud Netflix之Hystrix Dashboard的使用
  10. 奥威尔:老大哥在看着你-软件公司十诫
  11. UE4导入字体 ttf
  12. 2019-07高德地图行政区域省市区json数据获取(php代码)
  13. 需求预测——Gallat: A Spatiotemporal Graph Attention Network for Passenger Demand Prediction
  14. 红米4android7.0,红米4能刷android7,0系统吗
  15. TensorBoard对训练过程可视化(不用tf.summaries.merge_all)
  16. 数据的探索性分析(EDA)
  17. Http的POST和PUT提交方式的区别
  18. 易语言模拟器中控源码
  19. Linux配置ntp时间同步服务器(全)No association ID's returned
  20. 电路设计100个小技巧

热门文章

  1. 苹果吃鸡蓝牙耳机推荐什么牌子好?2022性价比高的蓝牙耳机推荐
  2. 微信小程序之校园摆渡车系统
  3. 深拷贝和浅拷贝(Es6)
  4. SAP 基于VUE的BSP OO单页移动端Web App开发
  5. Linux 网络通讯命令 查看端口命令
  6. 用jq撸一个简易轮播图
  7. RabbitMQ一键安装脚本
  8. [附源码]JAVA+ssm计算机毕业设计_旅游系统(程序+Lw)
  9. vue跨组件之间传值Provide/Inject
  10. Spring IoC组装打印机