目标
在本教程中,您将学习如何:
- 使用随机数生成器类 (cv::RNG) 以及如何从均匀分布中获取随机数。
- 使用函数 cv::p utText 在 OpenCV 窗口上显示文本
法典
- 在上一个教程(基础绘图)中,我们绘制了不同的几何图形,给出了坐标(以 cv::P oint 的形式)、颜色、厚度等作为输入参数。您可能已经注意到,我们为这些参数提供了特定的值。
- 在本教程中,我们打算对绘图参数使用随机值。此外,我们打算用大量的几何图形填充我们的图像。由于我们将以随机方式初始化它们,因此此过程将是自动的,并且使用 循环 .
- 此代码位于 OpenCV 示例文件夹中。否则你可以从这里抓住它
解释
- 让我们从查看 main 函数开始。我们观察到,我们做的第一件事是创建一个随机数生成器对象 (RNG):
RNG 实现了一个随机数生成器。在此示例中,rng 是使用值 0xFFFFFFFF 初始化的 RNG 元素
- 然后我们创建一个初始化为零的矩阵(这意味着它将显示为黑色),指定其高度、宽度和类型:
垫子图像 = Mat::zeros( window_height, window_width, CV_8UC3 );
imshow( window_name, 图像 );
- 然后我们继续画疯狂的东西。看了一下代码,可以看到它主要分为 8 个部分,定义为函数:
c = Drawing_Random_Lines(图像、window_name、rng);
if( c != 0 ) 返回 0;
c = Drawing_Random_Rectangles(图像、window_name、rng);
if( c != 0 ) 返回 0;
c = Drawing_Random_Ellipses( 图像, window_name, RNG );
if( c != 0 ) 返回 0;
c = Drawing_Random_Polylines( 图像, window_name, RNG );
if( c != 0 ) 返回 0;
c = Drawing_Random_Filled_Polygons( 图像, window_name, RNG );
if( c != 0 ) 返回 0;
c = Drawing_Random_Circles( 图像, window_name, RNG );
if( c != 0 ) 返回 0;
c = Displaying_Random_Text( 图像, window_name, RNG );
if( c != 0 ) 返回 0;
c = Displaying_Big_End( 图像, window_name, RNG );
所有这些函数都遵循相同的模式,因此我们将只分析其中的几个,因为相同的解释适用于所有函数。
- 查看函数Drawing_Random_Lines:
intDrawing_Random_Lines( Mat image, char* window_name, RNG rng )
{
int lineType = 8;
点 pt1、pt2;
for( int i = 0; i < NUMBER; i++ )
{
pt1 中。x = rng.uniform( x_1, x_2 );
pt1.y = rng.uniform( y_1, y_2 );
pt2.x = rng.uniform( x_1, x_2 );
pt2.y = rng.uniform( y_1, y_2 );
line( 图像, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 );
imshow( window_name, 图像 );
if( waitKey( 延迟 ) >= 0 )
{ 返回 -1;}
}
返回 0;
}
我们可以观察到以下几点:
- for 循环将重复 NUMBER 次。由于函数 cv::line 位于此循环中,这意味着将生成 NUMBER 行。
- 直线极值由 pt1 和 pt2 给出。对于 pt1,我们可以看到:
pt1.x = rng.uniform( x_1, x_2 );
pt1.y = rng.uniform( y_1, y_2 );
- 我们知道 rng 是一个随机数生成器对象。在上面的代码中,我们调用 rng.uniform(a,b)。这将在值 a 和 b 之间生成随机均匀分布(在 a 中包含,在 b 中排除)。
- 从上面的解释中,我们推断出极值 pt1 和 pt2 将是随机值,因此线的位置将非常不可预测,从而产生良好的视觉效果(查看下面的结果部分)。
- 作为另一个观察,我们注意到在 cv::line 参数中,对于颜色输入,我们输入:
让我们检查一下函数实现:
静态标量 randomColor( RNG& rng )
{
int icolor = (无符号) rng;
返回标量( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
}
正如我们所看到的,返回值是一个标量,其中包含 3 个随机初始化的值,这些值用作线条颜色的 R、G 和 B 参数。因此,线条的颜色也是随机的!
- 上面的解释适用于生成圆、椭圆、多边形等的其他函数。中心和顶点等参数也是随机生成的。
- 在完成之前,我们还应该看一下函数 Display_Random_Text 和 Displaying_Big_End,因为它们都有一些有趣的功能:
-
Display_Random_Text:
intDisplaying_Random_Text( Mat image, char* window_name, RNG rng )
{
int lineType = 8;
for ( int i = 1; i < NUMBER; i++ )
{
点组织;
org.x = rng.uniform(x_1, x_2);
org.y = rng.uniform(y_1, y_2);
putText( image, “测试文本渲染”, org, rng.uniform(0,8),
rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType);
imshow( window_name, 图像 );
如果( waitKey(DELAY) >= 0 )
{ 返回 -1;}
}
返回 0;
}
一切看起来都很熟悉,但表达方式:
putText( image, “测试文本渲染”, org, rng.uniform(0,8),
rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType);
那么,函数cv::p utText有什么作用呢?在我们的示例中:
- 在图像中绘制文本**“测试文本呈现”**
- 文本的左下角将位于 Point 组织中
- 字体类型是 字体类型是以下范围内的随机整数值: 。 范围内的随机整数值。[0,8>
- 字体的比例由表达式 rng.uniform(0, 100)x0.05 + 0.1 表示(表示其范围为:[0.1, 5.1>[0.1,5.1>)
- 文本颜色是随机的(用 randomColor(rng) 表示)
- 文本粗细介于 1 和 10 之间,由 rng.uniform(1,10) 指定
因此,我们将在图像上随机位置获得(类似于其他绘图函数)NUMBER 文本。
-
Displaying_Big_End
intDisplaying_Big_End( Mat image, char* window_name, RNG rng )
{
Size textsize = getTextSize(“OpenCV forever!”, FONT_HERSHEY_COMPLEX, 3, 5, 0);
点组织((window_width - textsize.width)/2, (window_height - textsize.height)/2);
int lineType = 8;
垫子图像2;
for( int i = 0; i < 255; i += 2 )
{
image2 = 图像 - 标量::all(i);
putText( image2, “OpenCV forever!”, org, FONT_HERSHEY_COMPLEX, 3,
标量(i, i, 255), 5, lineType );
imshow( window_name, image2 );
如果( waitKey(DELAY) >= 0 )
{ 返回 -1;}
}
返回 0;
}
除了函数 getTextSize(获取参数文本的大小)之外,我们可以观察到的新操作位于 foor 循环中:
因此,image2 是 image 和 Scalar::all(i) 的减法。 事实上,这里发生的事情是,image2 的每个像素都将是减去图像的每个像素减去 i 值的结果(请记住,对于每个像素,我们正在考虑三个值,例如 R、G 和 B,因此它们中的每一个都会受到影响)
还要记住,减法运算总是在内部执行饱和运算,这意味着获得的结果将始终在允许的范围内(在我们的示例中,没有负数,介于 0 和 255 之间)。
结果
正如您刚才在“代码”部分看到的,程序将按顺序执行各种绘图功能,这将产生:
-
首先,屏幕上将出现一组随机的 NUMBER 行,如以下屏幕截图所示:
- 然后,一组新的图形,这些时间矩形将随之而来。
-
现在将出现一些椭圆,每个椭圆都有随机的位置、大小、厚度和弧长:
-
现在,具有 03 段的折线将再次以随机配置出现在屏幕上。
- 填充的多边形(在本例中为三角形)将紧随其后。
-
最后一个出现的几何图形:圆圈!
- 在接近尾声时,文本 *“Testing Text Rendering”* 将以各种字体、大小、颜色和位置出现。
-
还有大结局(顺便说一句,这也表达了一个大事实):
在线教程
- 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程
- 人工智能入门 – 人工智能基础学习。Peter Norvig举办的课程
- EdX 人工智能 – 此课程讲授人工智能计算机系统设计的基本概念和技术。
- 人工智能中的计划 – 计划是人工智能系统的基础部分之一。在这个课程中,你将会学习到让机器人执行一系列动作所需要的基本算法。
- 机器人人工智能 – 这个课程将会教授你实现人工智能的基本方法,包括:概率推算,计划和搜索,本地化,跟踪和控制,全部都是围绕有关机器人设计。
- 机器学习 – 有指导和无指导情况下的基本机器学习算法
- 机器学习中的神经网络 – 智能神经网络上的算法和实践经验
- 斯坦福统计学习
有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取
人工智能书籍
- OpenCV(中文版).(布拉德斯基等)
- OpenCV+3计算机视觉++Python语言实现+第二版
- OpenCV3编程入门 毛星云编著
- 数字图像处理_第三版
- 人工智能:一种现代的方法
- 深度学习面试宝典
- 深度学习之PyTorch物体检测实战
- 吴恩达DeepLearning.ai中文版笔记
- 计算机视觉中的多视图几何
- PyTorch-官方推荐教程-英文版
- 《神经网络与深度学习》(邱锡鹏-20191121)
- …
第一阶段:零基础入门(3-6个月)
新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。
第二阶段:基础进阶(3-6个月)
熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。
第三阶段:工作应用
这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。
有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取