上一节我们学习了积分图(integral)相关的知识点,相信大家学习之后,对积分图已经有了基本的认识,从现在,我们开始了一个新的知识点,就是如何运用openCV中的绘制函数,本节呢,我们学习如何绘制一个带箭头的直线。
一、getFontScaleFromHeight()函数详解
1、函数原型
double getFontScaleFromHeight(
const int fontFace,
const int pixelHeight,
const int thickness = 1);
2、函数功能
计算用于给定高度的特定字体大小(以像素为单位);
3、参数详解
- 第一个参数,const int fontFace,使用指定的字体;
具体的字体类型有以下几种:
(1) FONT_HERSHEY_SIMPLEX,普通尺寸无衬线字体;
(2) FONT_HERSHEY_PLAIN, 小尺寸无衬线字体;
(3) FONT_HERSHEY_DUPLEX,普通尺寸无衬线字体,比FONT_HERSHEY_SIMPLEX更复杂;
(4) FONT_HERSHEY_COMPLEX,正常大小衬线字体;
(5) FONT_HERSHEY_TRIPLEX,正常大小衬线字体,比 FONT_HERSHEY_COMPLEX更复杂;
(6) FONT_HERSHEY_COMPLEX_SMALL,FONT_HERSHEY_COMPLEX的缩小版本;
(7) FONT_HERSHEY_SCRIPT_SIMPLEX,手写字体;
(8) FONT_HERSHEY_SCRIPT_COMPLEX,FONT_HERSHEY_SCRIPT_SIMPLEX更复杂的变体;
(9) FONT_ITALIC,斜体标志;
-
第二个参数,const int pixelHeight,像素高度;
-
第三个参数,const int thickness = 1,字体的粗细;
-
返回值,得到字体的大小用于putText函数;
二、getTextSize()函数详解
1、函数原型
Size getTextSize(
const String& text,
int fontFace,
double fontScale,
int thickness,
CV_OUT int* baseLine);
2、函数功能
计算文本字符串的宽度和高度;
3、参数详解
-
第一个参数,const String& text,输入的文本字符串;
-
第二个参数,int fontFace,字体;
-
第三个参数,double fontScale,字体缩放因子,乘以特定字体的基本大小;
-
第四个参数,int thickness,字体的宽度;
-
第五个参数,CV_OUT int* baseLine,基线相对于最底层文本的y坐标;
-
返回值,包含指定文本的框的大小;
三、putText()函数详解
1、函数原型
void putText(InputOutputArray img,
const String& text,
Point org,
int fontFace,
double fontScale,
Scalar color,
int thickness = 1,
int lineType = LINE_8,
bool bottomLeftOrigin = false);
2、函数功能
将文本字符串绘制到图像指定的位置上;
3、参数详解
-
第一个参数,InputOutputArray img,待绘制文本字符串的图像;
-
第二个参数,const String& text,文本字符串;
-
第三个参数,Point org,图像中文本字符串的左下角;
-
第四个参数,int fontFace,字体类型;
-
第五个参数,double fontScale,字体大小;
-
第六个参数,Scalar color,绘制字体使用的颜色;
-
第七个参数,int thickness = 1,字体的粗细;
-
第八个参数,int lineType = LINE_8,
-
第九个参数,bool bottomLeftOrigin = false,如果为真,则图像数据原点位于左下角;否则,它就在左上角;
四、综合实例
1、实验实例
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
int i = 0;
// 循环显示几种不同的字体
while(i<=8)
{
// 需要图片上显示的字体
String text = "Funny text";
// 字体的类型
int fontFace = i;
// 如果循环到了最后一个字体,则重新开始循环
if(i==8)
{
fontFace = 16;
i=-1;
}
// 计算字体的大小
double tmp = getFontScaleFromHeight(fontFace,10);
// 字体的缩放系数
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;
// 中心
Point textOrg((img.cols - textSize.width)/2,
(img.rows + textSize.height)/2);
// 绘制矩形
rectangle(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("dst",img);
waitKey(100);
i++;
}
return 0;
}
2、实验结果





我是奕双,现在已经毕业将近两年了,从大学开始学编程,期间学习了C语言编程,C++语言编程,Win32编程,MFC编程,毕业之后进入一家图像处理相关领域的公司,掌握了用OpenCV对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!
网友评论