ref:https://blog.csdn.net/guduruyu/article/details/68491211

https://blog.csdn.net/keith_bb/article/details/53366674

opencv中除了提供绘制各种图形的函数外,还提供了一个特殊的绘制函数——在图像上绘制文字。这个函数即是cv::putText()。

具体形式如下:

 void cv::putText(cv::Mat& img, // 待绘制的图像const string& text, // 待绘制的文字cv::Point origin, // 文本框的左下角int fontFace, // 字体 (如cv::FONT_HERSHEY_PLAIN)double fontScale, // 尺寸因子,值越大文字越大cv::Scalar color, // 线条的颜色(RGB)int thickness = 1, // 线条宽度int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)bool bottomLeftOrigin = false // true='origin at lower left');

参数解释:
. Mat& img: 要添加备注的图片
. const string& text: 要添加的文字内容
. Point org: 要添加的文字基准点或原点坐标,左上角还是左下角取决于最后一个参数bottomLeftOrigin的取值
. int fontFace: 文字的字体类型(Hershey字体集),可供选择的有
FONT_HERSHEY_SIMPLEX:正常大小无衬线字体
FONT_HERSHEY_PLAIN:小号无衬线字体
FONT_HERSHEY_DUPLEX:正常大小无衬线字体,比FONT_HERSHEY_SIMPLEX更复杂
FONT_HERSHEY_COMPLEX:正常大小有衬线字体
FONT_HERSHEY_TRIPLEX:正常大小有衬线字体,比FONT_HERSHEY_COMPLEX更复杂
FONT_HERSHEY_COMPLEX_SMALL:FONT_HERSHEY_COMPLEX的小译本
FONT_HERSHEY_SCRIPT_SIMPLEX:手写风格字体
FONT_HERSHEY_SCRIPT_COMPLEX:手写风格字体,比FONT_HERSHEY_SCRIPT_SIMPLEX更复杂
这些参数和FONT_ITALIC同时使用就会得到相应的斜体字
. double fontScale: 字体相较于最初尺寸的缩放系数。若为1.0f,则字符宽度是最初字符宽度,若为0.5f则为默认字体宽度的一半
. Scalar color: 很熟悉了,字体颜色
. int thickness = 1: 字体笔画的粗细程度,有默认值1
. int lineType = 8: 字体笔画线条类型,有默认值8
. bool bottomLeftOrigin = false: 如果取值为TRUE,则Point org指定的点为插入文字的左上角位置,如果取值为默认值false则指定点为插入文字的左下角位置.

对于字体的解释,请查看官方文档cvInitFont()

另外,我们在实际绘制文字之前,还可以使用cv::getTextSize()接口先获取待绘制文本框的大小,以方便放置文本框。具体调用形式如下:

 cv::Size cv::getTextSize(const string& text,cv::Point origin,int fontFace,double fontScale,int thickness,int* baseLine);

参数解释:
. const string& text: 输入的文本文字
. int fontFace: 文字字体类型
. double fontScale: 字体缩放系数
. int thickness: 字体笔画线宽
. CV_OUT int* baseLine: 文字最底部y坐标

下面就通过一个示例,来看看cv::getTextSize()与cv::putText()相结合的妙用:

 //创建空白图用于绘制文字cv::Mat image = cv::Mat::zeros(cv::Size(640, 480), CV_8UC3);//设置蓝色背景image.setTo(cv::Scalar(100, 0, 0));//设置绘制文本的相关参数std::string text = "Hello World!";int font_face = cv::FONT_HERSHEY_COMPLEX; double font_scale = 2;int thickness = 2;int baseline;//获取文本框的长宽cv::Size text_size = cv::getTextSize(text, font_face, font_scale, thickness, &baseline);//将文本框居中绘制cv::Point origin; origin.x = image.cols / 2 - text_size.width / 2;origin.y = image.rows / 2 + text_size.height / 2;cv::putText(image, text, origin, font_face, font_scale, cv::Scalar(0, 255, 255), thickness, 8, 0);//显示绘制解果cv::imshow("image", image);cv::waitKey(0);return 0;

绘制解果如下:

the other示例程序:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>using namespace std;
using namespace cv;int main()
{string text = "Funny text inside the box";//int fontFace = FONT_HERSHEY_SCRIPT_SIMPLEX;     //手写风格字体int fontFace = FONT_HERSHEY_SCRIPT_COMPLEX;double fontScale = 2;       //字体缩放比int thickness = 3;Mat img(600,800,CV_8UC3, Scalar::all(0));int baseline = 0;Size textSize = getTextSize(text, fontFace, fontScale, thickness, &baseline);baseline += thickness;//center the textPoint textOrg((img.cols - textSize.width)/2,(img.rows + textSize.height)/2);//draw the boxrectangle(img,textOrg + Point(0,baseline),textOrg + Point(textSize.width, -textSize.height),Scalar(0,0,255));line(img,textOrg + Point(0,thickness),textOrg + Point(textSize.width,thickness),Scalar(0,0,255));putText(img,text,textOrg,fontFace,fontScale,Scalar::all(255),thickness,8);imshow("text",img);waitKey(0);return 0;
}

程序解释:
. int fontFace = FONT_HERSHEY_SCRIPT_COMPLEX;字体为手写风格
. double fontScale = 2: 字体缩放比,在此处表示是默认字体大小的两倍
. Point textOrg((img.cols - textSize.width)/2,(img.rows + textSize.height)/2);这句代码可以求出字符串左下角位置坐标
. rectangle中第一个点:textOrg+Point(0, baseline)矩形框左下角坐标,第二个点:textOrg+Point(textSize.width,-textSize.height)是矩形的右上角
.Scalar::all(255)即三通道分量BGR均为255,字体为白色

程序运行结果:

OpenCV几个绘图函数

ref:https://blog.csdn.net/qq_41508747/article/details/88393433

矩形

rectangle(Mat& img,Point pt1, Point pt2, const Scalar&color, int thickness=1,int lineType=8, int shift=0)

rectangle(Mat& img,Rect rec, const Scalar&color, int thickness=1, int lineType=8,int shift=0)

intthickness为-1 则填充矩形   lineType线形

线

line(Mat& img, Point pt1,Point pt2, const Scalar& color, int thickness=1, int lineType=8,int shift=0)

circle(Mat&img, Point center, int radius, const Scalar&color,int thickness=1, intl ineType=8, int shift=0)

center圆心  radius半径

椭圆

ellipse(Mat& img, Point center,Size axes, double angle, double startAngle, double endAngle, const Scalar& color,int thickness=1, int lineType=8, int shift=0)

axes:横竖大小, angle旋转角度

折线

polylines(Mat& img, const Point** pts, const int* npts, int ncontours, bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )

文字

void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )

test文字 org左下坐标

例子

/*
绘图
*/
#include <cv.h>
#include <highgui.h>
#include <math.h>using namespace cv;
using namespace std;int main(int argc, char **argv)
{Mat canvas(400,400,CV_8UC3,Scalar(255,255,255));//线line(canvas, Point(10,10),Point(100,10),Scalar(0), 1, 8);line(canvas, Point(10,20),Point(200,20),Scalar(50), 2, 4);line(canvas, Point(10,40),Point(300,30),Scalar(100,200,255), 3, 2);line(canvas, Point(10,80),Point(400,40),Scalar(200), 4, 1);//矩形rectangle(canvas, Rect(Point(0,200),Point(40,280)),Scalar(0,0,255),-1,8);rectangle(canvas, Rect(Point(40,200),Point(80,280)),Scalar(0,255,0),4,8);rectangle(canvas, Rect(Point(80,200),Point(120,280)),Scalar(255,255,0),8,8);//○circle(canvas, Point(50,50),10, Scalar(0,0,255),2);circle(canvas, Point(300,100),5, Scalar(0,255,0),3);circle(canvas, Point(250,350),15, Scalar(255,0,0),4);        ellipse(canvas, Point(50,300),Size(20,10),0,0,300,Scalar(255,0,255),5);//文字putText(canvas,"(50,50)",Point(50,50),1,1,Scalar(0));putText(canvas,"(300,100)",Point(300,100),1,1,Scalar(0));putText(canvas,"(250,350)",Point(250,350),1,1,Scalar(0));putText(canvas,"(50,300)",Point(50,300),1,1,Scalar(0));//折线Point ps[1][5];ps[0][0] = Point(50,50);ps[0][1] = Point(300,100);ps[0][2] = Point(250,350);ps[0][3] = Point(50,300);            const Point* pts[1]={ps[0]};int pn[1]={4};polylines(canvas,pts,pn,1,true,Scalar(0));namedWindow("canvas", CV_WINDOW_AUTOSIZE);imshow("canvas", canvas);waitKey(0);return 0;
}

OpenCV 文字绘制cv::putText详解相关推荐

  1. [转] OpenCV 文字绘制cv::putText详解

    ref:[OpenCV3]文字绘制--cv::putText详解_cv.puttext_PHILOS_THU的博客-CSDN博客 opencv学习(十三)之文本文字插入_opencv视频添加文本并保存 ...

  2. OpenCV 文字绘制----cv::putText详解

    opencv中除了提供绘制各种图形的函数外,还提供了一个特殊的绘制函数--在图像上绘制文字.这个函数cv::putText(). 具体形式如下: void cv::putText( cv::Mat&a ...

  3. 【OpenCV3】文字绘制——cv::putText详解

    opencv中除了提供绘制各种图形的函数外,还提供了一个特殊的绘制函数--在图像上绘制文字.这个函数即是cv::putText(). 具体形式如下: void cv::putText(cv::Mat& ...

  4. cv::putText详解

    https://blog.csdn.net/guduruyu/article/details/68491211 opencv中除了提供绘制各种图形的函数外,还提供了一个特殊的绘制函数--在图像上绘制文 ...

  5. OpenCV文字绘制函数putText()的使用

    OPenCV版本:4.4 IDE:VS2017 功能描述 简述:在一个图像里绘制文字. 函数 cv::putText在图像里渲染指定的字符串. 符号不能被渲染,用问号来代替.参见 getTextSiz ...

  6. 【OpenCV3】棋盘格角点检测与绘制——cv::findChessboardCorners()与cv::drawChessboardCorners()详解

    棋盘格法是摄像机标定中常用的一种方法,在使用该方法时需要对棋盘格的角点进行检测.opencv中封装了一个专门用于棋盘格角点检测的函数即cv::findChessboardCorners(),同时,也提 ...

  7. 海康工业相机SDK+OpenCV实例(2):RawDataFormatConvert详解

    海康工业相机SDK+OpenCV实例(2): RawDataFormatConvert详解 文章目录 海康工业相机SDK+OpenCV实例(2): RawDataFormatConvert详解 前言 ...

  8. OpenCV基础类型4--cv::Mat详解

    cv::Mat是OpenCV定义的用于表示任意维度的稠密数组,OpenCV使用它来存储和传递图像,理解它对我们操作图像是有帮助的,本文将介绍cv::Mat的初始化方式.内置方法等. 元素类型定义 由于 ...

  9. python画直方图成绩分析-python plotly绘制直方图实例详解

    计算数值出现的次数 import cufflinks as cf cf.go_offline() import numpy as np import pandas as pd set_slippage ...

最新文章

  1. 前端进阶(三) webpack处理vue以及vue-cli脚手架环境
  2. Struts 体系结构与工作原理(图) .
  3. windows7计算机管理,win7系统打开计算机管理(compmgmt.msc)的操作方法
  4. android中的多媒体应用camera
  5. Linux 块与文件大小
  6. 每周进度条(第10周)
  7. docker--删除container和image
  8. 如何在苹果 Mac 上的“快速查看”中查看和编辑文件?
  9. 女程序员上班第一件事:调整IDE颜色以适配今天的衣着妆容
  10. mac 备份android 手机通讯录导入iphone,iphone如何导出通讯录(轻松教你iPhone备份通讯录的方法)...
  11. android plaid,Plaid 开源库学习
  12. 为软件添加全网排行榜
  13. 解决vue方法在谷歌浏览器中无法正常实现的问题
  14. 基于R语言时间序列的平稳时间序列模型预测
  15. 网络安全系列之培训笔记整理
  16. C语言实现扩展欧几里得算法
  17. 「 ROS 」Gazebo仿真平台中机器人添加运动关节(旋转副)讲解
  18. MDS(多维尺度变换)降维算法
  19. 网易2018实习生招聘笔试题-JAVA开发实习生
  20. js实现用户输入年月份,判断是否为闰年,该月份有多少天

热门文章

  1. 编辑重命名文件夹下多个文件名,一键操作技巧
  2. Spring AOP动态代理
  3. 抖音小程序创建广告位
  4. 抖音小程序配置webview域名
  5. android相关学习网站
  6. 电脑定时关机、取消定时关机、滑动关机
  7. C# %253A%252F%252F 咋编码
  8. 对与association和collection的理解:
  9. 修改数据库的名字和表名
  10. SOEM 源码解析 ecx_set_slaves_to_default