运行环境:


vs2013、opencv3.3、win10-64bit

下载显示中文类:

OpenCV默认是不支持显示中文字符的,于是网上有人自己写了一个类实现,只需要下载到自己的代码文件中,添加头文件就可以通过调用函数来显示中文了。

1)显示中文类下载链接:(若链接失效,文字最后有源码)

百度网盘:https://pan.baidu.com/s/1gdYatLLOKmDI-_6OOzdQNg 
     提取码:o7p7

2)下载后文件名为:“puttextzh.cpp”,“puttextzh.cpp”

3)将这两个文件加入到项目文件夹中,并加入工程中

4)使用时加入头文件“puttextzh.h”

函数原型:


void putTextZH(cv::Mat &dst, const char* str, cv::Point org, cv::Scalar color, int fontSize, const char* fn, bool italic, bool underline)

参数解释:


dst:输入,原图像,即待加中文的图像;

str:中文字符串;

org:字符串像素点位置:

color:字符串颜色;

fontSize:字体大小;

fn:字体类型(默认Arial字体类型):

italic:斜体(默认无斜体):

underline:下划线(默认无下划线):

示例代码:


在lenna图像坐标为(50,60)位置加上字符串“我的名字叫lenna”,字体颜色:白色,字体大小:40,字体类型:微软雅黑

putTextZH(srcImg, "我的名字叫lenna", Point(50, 60), Scalar(255, 255, 255), 40, "微软雅黑");

#include<iostream>
#include"opencv2/opencv.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"puttextzh.h"using namespace std;
using namespace cv;int main()
{Mat srcImg = imread("E:\\Project\\opencvPicture\\lenna.jpg");//打开图像if (srcImg.empty())//判断是否正确打开图片{cout << "加载图像失败!" << endl;return -1;}imshow("原图", srcImg);//显示原图putTextZH(srcImg, "我的名字叫lenna", Point(50, 60), Scalar(255, 255, 255), 40, "微软雅黑");//图像上加中文imshow("原图加中文", srcImg);waitKey(0);return 0;
}

运行结果:


中文类库源码:

puttextzh.cpp

#include "puttextzh.h"
#include "windows.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(cv::Mat &dst, const char* str, cv::Point org, cv::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);
}

puttextzh.h

#ifndef PUTTEXTZH_H_
#define PUTTEXTZH_H_
//#include "opencv.hpp"
#include "opencv2/opencv.hpp"void putTextZH(cv::Mat &dst, const char* str, cv::Point org, cv::Scalar color, int fontSize,const char *fn = "Arial", bool italic = false, bool underline = false);#endif // PUTTEXT_H_

参考:https://blog.csdn.net/mars_xiaolei/article/details/91381148

opencv-图像上显示中文相关推荐

  1. Matplotlib:在图像上用中文进行标记时,不能显示中文,显示为方框

    Matplotlib:在图像上用中文进行标记时,不能显示中文,显示为方框 1.问题背景 2.解决方法 1.问题背景 首先,博主的系统环境如下: Win10 1709  教育版 Anaconda3-5. ...

  2. UIQ3.0系列--在模拟器上显示中文

    如何在UIQ3.0SDK的模拟器上显示中文? =============================================================   UIQ3.0的SDK并没有 ...

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

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

  4. OpenCV 图像无法显示 (python)

    同步发于 JuzerTech 网站,里面有我软.硬件学习的纪录与科技产品开箱,欢迎进去观看. 使用 OpenCV 也一段时间了,从以前用 C++ 写,到现在用 python 写,每次只要一段时间没用, ...

  5. opencv 图像读写显示、matplotlib 库图像读写显示

    图片格式: bmp 全称:Bitmap 不压缩 png 全称:Portable Network Graphics 无损压缩 jpg 全称:Joint Photographic Experts Grou ...

  6. 语义分割的标签在原图像上显示

    最近在做医学图像的语义分割,新手一枚,现实情况是小朋友我真得有很多问号[手动捂脸哭].经过一段时间的钻(tuo)研(fa),终于有了些许眉目,也有时间在这里记录一下自己的一些想法.这篇博客主要介绍一种 ...

  7. windows电脑上显示中文完好,新安装的办公系统上输入中文显示错误、无法显示中文

    问题描述:在自己电脑是所有地方都能正常显示中文字体,却在新下载的公司OA办公软件中输入中文简体字无法准确显示,当输入一个字体时不能显示,输入多个字却显示其他不对应的字. 解决方法: 打开设置,找到下面 ...

  8. JS网页上显示中文乱码解决方法

    问题描述 js文件在Eclipse显示中文正常,在网页中打开源文件中文便变成乱码.其中,js文件编码为UTF-8,javaScript引用时也设定编码为utf-8,但仍然无效. 解决方案 更改js源文 ...

  9. opencv 图像上画出目标运动的轨迹_OpenCV视频分析-Meanshift、Camshift运动轨迹绘制...

    基于均值迁移的对象移动分析(Meanshift) ✏️ ⛳️ 概述 本质: ✔️ Mean Shift均值漂移算法是无参密度估计理论的一种,无参密度估计不需要事先知道对象的任何先验知识,完全依靠训练数 ...

最新文章

  1. cplus cjson 封装
  2. 从HTML5移动应用现状谈发展趋势
  3. 深度学习100例 | 第25天-卷积神经网络(CNN):中文手写数字识别
  4. 04_ReplaceBlank
  5. myeclipse8.5 离线装SVN
  6. Linux的实际操作:查询用户id切换用户su -
  7. php投票的进度条,小程序实现投票进度条
  8. 数字孪生 - 认知篇
  9. Otter CTF (取证专项赛)WP兼volatility取证工具运用技巧
  10. Qt QML应用框架
  11. javaweb解决get请求中文乱码问题
  12. 软件获取imei和imsi_获取设备信息(imei、imsi、uuid)的调整使用plus.device.getInfo方法的说明...
  13. Android超炫图片浏览器代码
  14. 斐讯设备远程控制教程(以K3、N1为例)
  15. unit自动驾驶怎么使用_自动驾驶与驾驶辅助系统 正确使用驾驶辅助系统
  16. 多项式的余数定理及其应用
  17. 小波变换的matlab实现,维小波变换MATLAB实现
  18. mysql 视图的作用
  19. 学校计算机教室建设要求,计算机教室施工建设要求
  20. CNN中十大拍案叫绝的操作

热门文章

  1. 3DES、DES的CBC、ECB
  2. 使用YOLOV5进行手势识别(详细教程)
  3. 【你不知道的Java】-汉字转换拼音
  4. Windows常用网络操作命令
  5. iphone html5 跑多少钱,2018款新iPhone售价曝光:起步价维持去年水平
  6. python魔法方法__new__(),__init__()
  7. 私有云落地解决方案之网络篇-关键技术-DHCP地址-1
  8. Protobuf之proto js生成
  9. Tomcat服务器集群搭建
  10. Android平台GB28181接入端如何对接UVC摄像头?