使用 OpenCV 的随机生成器和文本

目标

在本教程中,您将学习如何:

  • 使用随机数生成器类 (cv::RNG) 以及如何从均匀分布中获取随机数。
  • 使用函数 cv::p utText 在 OpenCV 窗口上显示文本

法典

  • 在上一个教程(基础绘图)中,我们绘制了不同的几何图形,给出了坐标(以 cv::P oint 的形式)、颜色、厚度等作为输入参数。您可能已经注意到,我们为这些参数提供了特定的值。
  • 在本教程中,我们打算对绘图参数使用随机值。此外,我们打算用大量的几何图形填充我们的图像。由于我们将以随机方式初始化它们,因此此过程将是自动的,并且使用 循环 .
  • 此代码位于 OpenCV 示例文件夹中。否则你可以从这里抓住它

解释

  1. 让我们从查看 main 函数开始。我们观察到,我们做的第一件事是创建一个随机数生成器对象 (RNG):
    RNG rng( 0xFFFFFFFF );
    RNG 实现了一个随机数生成器。在此示例中,rng 是使用值 0xFFFFFFFF 初始化的 RNG 元素
  2. 然后我们创建一个初始化为的矩阵(这意味着它将显示为黑色),指定其高度、宽度和类型:
    垫子图像 = Mat::zeros( window_height, window_width, CV_8UC3 );
    imshow( window_name, 图像 );
  3. 然后我们继续画疯狂的东西。看了一下代码,可以看到它主要分为 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 );
    所有这些函数都遵循相同的模式,因此我们将只分析其中的几个,因为相同的解释适用于所有函数。
  4. 查看函数Drawing_Random_Lines
    intDrawing_Random_Lines( Mat image, char* window_name, RNG rng )
    {
    int lineType = 8;
    pt1、pt2;
    forint 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, 图像 );
    ifwaitKey( 延迟 ) >= 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 参数中,对于颜色输入,我们输入:
        随机颜色(rng)
        让我们检查一下函数实现:
        静态标量 randomColor( RNG& rng )
        {
        int icolor = (无符号) rng;
        返回标量( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
        }
        正如我们所看到的,返回值是一个标量,其中包含 3 个随机初始化的值,这些值用作线条颜色的 RG 和 B 参数。因此,线条的颜色也是随机的!
  5. 上面的解释适用于生成圆、椭圆、多边形等的其他函数。中心顶点等参数也是随机生成的。
  6. 在完成之前,我们还应该看一下函数 Display_Random_Text 和 Displaying_Big_End,因为它们都有一些有趣的功能:
  7. Display_Random_Text:

    intDisplaying_Random_Text( Mat image, char* window_name, RNG rng )
    {
    int lineType = 8;
    forint 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 文本。

  8. 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;
    forint 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 = 图像 - 标量::all(i)

    因此,image2 是 image 和 Scalar::all(i) 的减法。 事实上,这里发生的事情是,image2 的每个像素都将是减去图像的每个像素减去 i 值的结果(请记住,对于每个像素,我们正在考虑三个值,例如 R、G 和 B,因此它们中的每一个都会受到影响)

    还要记住,减法运算总是在内部执行饱和运算,这意味着获得的结果将始终在允许的范围内(在我们的示例中,没有负数,介于 0 和 255 之间)。

结果

正如您刚才在“代码”部分看到的,程序将按顺序执行各种绘图功能,这将产生:

  1. 首先,屏幕上将出现一组随机的 NUMBER 行,如以下屏幕截图所示:

    Drawing_2_Tutorial_Result_0.jpg

  2. 然后,一组新的图形,这些时间矩形将随之而来。
  3. 现在将出现一些椭圆,每个椭圆都有随机的位置、大小、厚度和弧长:

    Drawing_2_Tutorial_Result_2.jpg

  4. 现在,具有 03 段的折线将再次以随机配置出现在屏幕上。

    Drawing_2_Tutorial_Result_3.jpg

  5. 填充的多边形(在本例中为三角形)将紧随其后。
  6. 最后一个出现的几何图形:圆圈!

    Drawing_2_Tutorial_Result_5.jpg

  7. 在接近尾声时,文本 *“Testing Text Rendering”* 将以各种字体、大小、颜色和位置出现。
  8. 还有大结局(顺便说一句,这也表达了一个大事实):

Drawing_2_Tutorial_Result_big.jpg

   在线教程

有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

请添加图片描述

人工智能书籍

第一阶段:零基础入门(3-6个月)

新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。

第二阶段:基础进阶(3-6个月)

熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。

第三阶段:工作应用

这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。

 有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

  • 36
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值