OpenCV puttext不调库显示中文
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不调库显示中文相关推荐
- Python学习之matplotlib库-显示中文
目录 一. 直接修改配置文件matplotlibrc 二.在运行的程序中添加代码 (一)matplotlib 动态修改配置 (二)matplotlib 设置自定义字体 matplotlib在绘图时,会 ...
- 关于128x64 SH1106的OLED屏幕使用U8g2库显示中文
关于128x64 SH1106的OLED屏幕使用U8g2库驱动讲解 首先感谢: 1.坛友:知行创意实验室 2. oled 3. u8g2如何显示中文 上面的最先发文讲解了有关SH1106的OLED屏幕 ...
- opencv-图像上显示中文
运行环境: vs2013.opencv3.3.win10-64bit 下载显示中文类: OpenCV默认是不支持显示中文字符的,于是网上有人自己写了一个类实现,只需要下载到自己的代码文件中,添加头文件 ...
- Ubuntu下让matplotlib显示中文字体
文章目录 安装中文字体 显示matplotlib库的字体文件夹 删除matplotlib 的缓存文件(可选) matplotlib中设置字体,显示! 参考文章: https://zodiac911.g ...
- OpenCV显示中文汉字,未使用CvxText和FreeType库
OpenCV显示中文汉字,未使用CvxText和FreeType库 采用windows的GDI显示系统的TrueType字体,没有封装,就两个函数,分成了h和cpp文件,可以自己编辑文件名和函数名,亦 ...
- C++ OpenCV【解决putText不能显示中文】
使用cv::putText写中文字符时输出结果为"??????"......这怎么能忍? python方法中可以将opencv图片转化为PIL,写中文之后再转回opencv格式. ...
- jetson nano 在opencv拉流的视频上显示中文汉字(含c++完整源码)
目录 问题 解决方案 步骤一:生成中文图片 步骤二:中文图片蒙皮到视频帧,形成中文显示效果 问题 在jetson nano这样的嵌入式设备上,用opencv拉流,并在实时视频上面,显示汉字. 关于使用 ...
- OpenCV显示中文字体
01.引言 OpenCV-Python 是一个用来图像处理的 Python 库,但其一般不能在图片上显示中文,否则会乱码.但有些情况下我们必须要显示中文,因此,我们可以使用 PIL 库来写中文,再转换 ...
- Ubuntu下使用OpenCV显示中文
由于Opencv默认不显示中文,所以我们需要通过需要通过一些库来设置OpenCV支持中文显示 源码下载链接:Ubuntu下Opencv显示中文 代码说明 项目需要ft2build.h,它是freety ...
最新文章
- 2022 年营销自动化七大趋势前瞻
- 微信小程序之scroll-view-导航栏左右滑动
- vue中父子组件先后渲染_vue父子组件传值(子传父,非父子组件传值)
- leetcode 976. 三角形的最大周长
- 用shell脚本一键搭建LNMP环境实战
- 深入源码之Commons Logging[转]
- 125 个视频成就千万级网红,Python 告诉你李子柒都在拍些什么?
- TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:
- SpringCloud学习笔记(15)----Spring Cloud Netflix之Hystrix Dashboard的使用
- 奥威尔:老大哥在看着你-软件公司十诫
- UE4导入字体 ttf
- 2019-07高德地图行政区域省市区json数据获取(php代码)
- 需求预测——Gallat: A Spatiotemporal Graph Attention Network for Passenger Demand Prediction
- 红米4android7.0,红米4能刷android7,0系统吗
- TensorBoard对训练过程可视化(不用tf.summaries.merge_all)
- 数据的探索性分析(EDA)
- Http的POST和PUT提交方式的区别
- 易语言模拟器中控源码
- Linux配置ntp时间同步服务器(全)No association ID's returned
- 电路设计100个小技巧