智能车摄像头算法——圆环元素

这篇具有很好参考价值的文章主要介绍了智能车摄像头算法——圆环元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.入环的函数

(1)搜上下边线

搜上下边线,处理圆环的时,可以利用上下边线的特点。

uint8_t UpdownSideGet(uint8_t imageInput[OV7725_UART_H][OV7725_UART_W], uint8_t imageOut[2][OV7725_UART_W])
{
    uint8_t i = 0, j = 0;
    uint8_t last = OV7725_UART_H/2;

    imageOut[0][OV7725_UART_W-1] = 0;
    imageOut[1][OV7725_UART_W-1] = OV7725_UART_H-1;
     //从图像中间行    从中到下     从中到上      扫描

    //处理中间单独那一列的上下边线
    for(i = last; i >= 0; i--)
    {
        if(!imageInput[i][OV7725_UART_W/2])
        {
            imageOut[up][OV7725_UART_W/2] = i;
            break;
        }
    }

    for(i = last; i < OV7725_UART_H; i++)
    {
        if(!imageInput[i][OV7725_UART_W/2])
        {
            imageOut[down][OV7725_UART_W/2] = i;
            break;
        }
    }
    //其他列的上下边线
    //从中到左
    for(i = OV7725_UART_W/2-1; i > 0; i--)//遍历每一列
    {
        imageOut[up][i] = 0;
        imageOut[down][i] = OV7725_UART_H-1;

        for(j = imageOut[0][i+1] + 5; j > 0; j--)//一列中的扫描每行  从上列的行数+10开始向上扫描
        {
            if(!imageInput[j][i])
            {
                imageOut[up][i] = j;
                break;
            }
        }
        for(j = imageOut[1][i+1] - 5; j < OV7725_UART_H; j++)
        {
            if(!imageInput[j][i])
            {
                imageOut[down][i] = j;
                break;
            }
        }
    }

    //从中到右
    for(i = OV7725_UART_W/2+1; i < OV7725_UART_W-1; i++)
        {
            imageOut[up][i] = 0;
            imageOut[down][i] = OV7725_UART_H-1;

            for(j = imageOut[0][i-1] + 5; j > 0; j--)
            {
                if(!imageInput[j][i])
                {
                    imageOut[up][i] = j;
                    break;
                }
            }
            for(j = imageOut[1][i-1] - 5; j < OV7725_UART_H; j++)
            {
                if(!imageInput[j][i])
                {
                    imageOut[down][i] = j;
                    break;
                }
            }
        }
    return 0;
}

(2)找凸起的弧

找凸起的弧,用于圆环的检测。如下图红色的线。
智能车摄像头圆环,全国大学生智能车竞赛,算法,单片机,c语言,嵌入式硬件

RoundaboutGetArc函数中传入的num代表着,要检测的这个圆弧大小,要求这个圆弧包含多少个点。

以左圆环为例:
先判断边线丢不丢线,不丢线再进行下一步。由于是遍历一幅图像左边线数组的每一行,我们就找这样一个特征:它下面连续递减点的个数+它上面连续递减点的个数+跟它横坐标一样大的点的个数 >=我们设定的值。这个就是我们认为的圆弧

/*!
  * @brief    判断左右边线是否存在弧形
  * 输出的 index 圆弧的顶点位置
  * @param    imageInput : 二值图像信息
  * @param    imageOut   : 边线数组
  * @param    status     : 1:左边线  2:右边线
  * @param    num        : 圆弧的大小 用点数表示  (连续N个增  连续N个减)
  * @return   1 有弧线    0  没弧线

  */
uint8_t RoundaboutGetArc(uint8_t imageSide[OV7725_UART_H][2], uint8_t status, uint8_t num,uint8_t* index)
{
    int i = 0;
    uint8_t inc = 0, dec = 0, n = 0;
    switch(status)
    {
      case 1:
        for(i = START_H-2; i > END_H; i--)
        {
        	//没有丢线  
            if(imageSide[i][0] != 1 && imageSide[i+1][0] != 1)
            {
                if(imageSide[i][0] == imageSide[i+1][0])
                {
                    n++;
                    continue;
                }
                if(imageSide[i][0] > imageSide[i+1][0])
                {
                    inc++;
                    inc+=n;
                    n=0;
                }
                else
                {
                    dec++;
                    dec+=n;
                    n=0;
                }

                /* 有弧线 */
                if(inc > num && dec > num)
                {
                    *index = i + num;
                    return 1;
                }
            }
            else
            {
                inc = 0;
                dec = 0;n=0;
            }
        }

        break;

      case 2:
        for(i = START_H-2; i > END_H; i--)
        {
            if(imageSide[i][1] != OV7725_UART_W-1 && imageSide[i+1][1] != OV7725_UART_W-1)
            {
                if(imageSide[i][1] == imageSide[i+1][1])
                {
                    n++;
                    continue;
                }
                if(imageSide[i][1] > imageSide[i+1][1])
                {
                    inc++;
                    inc+=n;
                    n = 0;
                }
                else
                {
                    dec++;
                    dec+=n;
                    n=0;
                }

                /* 有弧线 */
                if(inc > num && dec > num)
                {
                    *index = i + num;
                    return 1;
                }
            }
            else
            {
                inc = 0;
                dec = 0;n=0;
            }
        }

        break;
    }

    return 0;
}

(3)两点之间补线

/*!
   * @brief    补线处理
   *
   * @param    imageSide  : 边线
   * @param    status     : 1:左边线补线   2:右边线补线
   * @param    startX     : 起始点 列数
   * @param    startY     : 起始点 行数
   * @param    endX       : 结束点 列数
   * @param    endY       : 结束点 行数
   *
   * @return
   *
   * @note     endY 一定要大于 startY
   *
   */
 void ImageAddingLine(uint8_t imageSide[OV7725_UART_H][2], uint8_t status, uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY)
 {
     int i = 0;

     // 直线 x = ky + b
     float k = 0.0f, b = 0.0f;
     switch(status)
     {
       case 1://左补线
         {
             k = (float)((float)endX - (float)startX) / (float)((float)endY - (float)startY);
             b = (float)startX - (float)startY * k;

             for(i = startY; i < endY; i++)
             {
                 imageSide[i][0] = (uint8_t)(k * i + b);
             }
             break;
         }

       case 2://右补线
         {
             k = (float)((float)endX - (float)startX) / (float)((float)endY - (float)startY);
             b = (float)startX - (float)startY * k;

             for(i = startY; i < endY; i++)
             {
                 imageSide[i][1] = (uint8_t)(k * i + b);
             }
             break;
         }

     }
 }

(4)判断上线是否单调

/*!
  * @brief    判断上边线是否单调
  * @param    X1 :起始X点
  * @param    X2 :终止X点              X1 < X2
  * @param    imageIn : 边线数组
  *
  * @return   0:不单调or错误, 1:单调递增, 2:单调递减
  *
  * @note
  *
  * @see
  *
  * @date     2021/11/30 星期二
  */
uint8_t RoadUpSide_Mono(uint8_t X1, uint8_t X2, uint8_t imageIn[2][OV7725_UART_W])
{
    uint8_t i = 0, num = 0;

    for(i = X1; i < X2-1; i++)
    {
        if(imageIn[0][i] >= imageIn[0][i+1])
            num++;
        else
            num = 0;
        if (num >= (X2-X1)*4/5)
            return 1;
    }

    for(i = X1; i < X2-1; i++)
    {
        if(imageIn[0][i] <= imageIn[0][i+1])
            num++;
        else
            num = 0;
        if (num >= (X2-X1)*4/5)
            return 2;
    }
    return 0;
}

2.找圆环

找圆环的特征,以左圆环为例,要求“左边线有弧,右边线单调”。左边线有弧已经说过了,这里的“右边线单调”:需要右边线在一定的横坐标范围内单调的点数大于我们设定的值,才认为是这里的“右边线单调”。

uint8_t RoadIsRoundabout(uint8_t Upimage[2][OV7725_UART_W], uint8_t imageInput[OV7725_UART_H][OV7725_UART_W], uint8_t image[OV7725_UART_H][2], uint8_t *flag)
{
    uint8_t i = 0;
    errL=0, errR=0;
    leftState = 0, rightState = 0;
     count = 0;
    uint8_t num = 0, py;

    
    // 从车头往前 左边线是否单调
    for(i = START_H-2; i > END_H; i--)
    {
        if(image[i][0] == 1)
            continue;
        if(image[i][0] >= image[i+1][0])    // i是Y坐标值  0 是图像左线X坐标
        {
            if(image[i][0]<OV7725_UART_W/2 - 5)
                                    num++;
            else
                   num = 0  ;

            if(num == 50)
            {
                num = 0;
                leftState = 1;   // 左单调标志
                break;
            }
        }
        else
        {
            num = 0;
        }
        if(i <= END_H+1)  //   清0
            num = 0;
    }


    errL = RoundaboutGetArc(image, 1, round_size, &py);
    errR = RoundaboutGetArc(image, 2, round_size, &py);

    // 右边线是否单调
    for(i = START_H-2; i > END_H; i--)
    {
        if(image[i][1] == OV7725_UART_W-1)
            continue;

        if(image[i][1]<= image[i+1][1])
        {
            if(image[i][1]>OV7725_UART_W/2 + 5)
                           num++;
            else
                    num = 0  ;


            if(num == 50)
            {
                num = 0;
                rightState = 1;
                break;
            }
        }
        else
        {
              num = 0;
        }

        if(i <= END_H+1)
            num = 0;
    }

    // 左边单调, 检测右侧是否是环岛
    if(leftState == 1 && rightState == 0 && errL == 0)
    {
        count = 0;

        if(RoundaboutGetArc(image, 2, round_size, &count))
        {
            *flag = 1;
            return 1;
        }
        else
        {
            return 0;
        }
    }

    /* 右边单调, 检测左侧是否是环岛 */
    if(rightState == 1 && leftState == 0&& errR == 0)
    {
        count = 0;
        if(RoundaboutGetArc(image, 1, round_size, &count))
        {
            *flag = 2;
            return 2;
        }
    }
    return 0;
}

3.补线入环出环

右环为例,左环也是一样,对称写(右环为奇数状态,左环为偶数状态)。目前已经找到圆环,进入状态1。
状态1:找到圆环后,补一条线,保证车子直走。一直检查圆弧还在不在,直到弧消失了,就进入状态3。
智能车摄像头圆环,全国大学生智能车竞赛,算法,单片机,c语言,嵌入式硬件

状态3:让车子一直往右拐,一直拐到上线单调的时候。进入状态5

这个还没拐成,要继续拐。
智能车摄像头圆环,全国大学生智能车竞赛,算法,单片机,c语言,嵌入式硬件
拐到这种时候,就已经进入圆环口了,可以不用拐了。
智能车摄像头圆环,全国大学生智能车竞赛,算法,单片机,c语言,嵌入式硬件在圆环内,都是这种图像,正常走就行了,之后的状态就是出圆环了。

状态5:出圆环,找右边凸起的位置+下线全是最低点这种情况,然后补一条线,让车子向左拐。一直拐到上线单调的时候,进入状态7.

一直拐
智能车摄像头圆环,全国大学生智能车竞赛,算法,单片机,c语言,嵌入式硬件拐到上线单调了,进入状态7。
智能车摄像头圆环,全国大学生智能车竞赛,算法,单片机,c语言,嵌入式硬件
状态7:加大力度拐,拐到上线不单调的时候,就出圆环正常行驶了。

智能车摄像头圆环,全国大学生智能车竞赛,算法,单片机,c语言,嵌入式硬件

参考代码
具体要根据车子的速度和摄像头选择图像的大小来确定里面的参数

void RoundaboutProcess(uint8_t imageInput[OV7725_UART_H][OV7725_UART_W], uint8_t imageSide[OV7725_UART_H][2], uint8_t UpdowmSide[2][OV7725_UART_W], uint8_t* state)
{

    uint8_t i = 0, err5 = 0;
    uint8_t pointX = 0, pointY = 0, inc = 0, dec = 0;
    uint8_t flag= 0, Down_flag = 0;
    static uint8_t finderr = 0;
    static uint8_t err1 = 0;

    switch(*state)
    {
    //奇数为入右圆环
        case 1:
          
            // 检查弧线
            err1 = RoundaboutGetArc(imageSide, 2, 3, &pointY);

            // 有弧线 进行补线 连接弧线最右点 和 图像左下角
            if(err1)
            {
                pointX = imageSide[pointY][1];
                ImageAddingLine(imageSide, 2, pointX, pointY, OV7725_UART_W-1, START_H);
                finderr = 1;
            }
            else
            {
                if(finderr)
                    *state = 3;//准备进入环岛
            }

            break;

            /* 发现左环岛 环岛出口处补线 */

       

        case 3:

            for(i=1;i<OV7725_UART_H-1;i++)
               {
                     ImageSide[i][0]= ImageSide[i][0]+50;

               }

            if(RoadUpSide_Mono(30, OV7725_UART_W-1,UpdowmSide) == 1)//上线单调增进入下一步
                  *state = 5;

              break;




        case 5 :

                err5 = RoundaboutGetArc(imageSide, 1, 10, &pointY);

                //检查下线
                for(i = OV7725_UART_W-1; i > 0; i--)
                {
                    if(UpdowmSide[1][i] == 119)
                          inc++;
                    else
                         dec++;
                    if( dec <= 15)
                    {
                        Down_flag = 1;
                        break;
                    }
                 }

                flag = RoadUpSide_Mono(20, OV7725_UART_W,UpdowmSide);

                if(flag && err5 && Down_flag)
                {
                     *state = 7;
                }
                break;


        case 7:

                ImageAddingLine(imageSide, 1, 80, 10, 0, START_H);
                flag = RoadUpSide_Mono(50, OV7725_UART_W,UpdowmSide);

                if(flag==0)
                {

                    *state = 0;
                    finderr = 0;
                    err1 = 0;

                }

有问题可以私聊我咯~
可以加企鹅群 658476482 交流
另外承接各种单片机设计~文章来源地址https://www.toymoban.com/news/detail-860214.html

到了这里,关于智能车摄像头算法——圆环元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【智能家居】8、摄像头模块安装以及监控代码编写

    需要毕业论文可以私信获取哦 摄像头模块RaspBerry Pi Camera Module V2 树莓派断电后 将摄像头 模块排针接到下图所示的口中(注意排针方向)   1、扩容 首先输入df -h命令查看可用空间,如果空间不足配置过程中可能会遇到 E: You don t have enough free space in /var/cache/apt/archives/.这个报错

    2024年04月16日
    浏览(38)
  • 智能家居(6) —— 香橙派摄像头安装实现监控功能

    目录 一、USB摄像头测试 二、face_recognition 人脸识别库的安装和测试方法 三、face_recognition 的测试方法 face_recognition 的使用         定位人脸,人脸识别,识别单张图片中人脸的关键点,识别人脸并使用方框标注,比较两个人脸是否属于一个人,识别未知图片中的人脸是谁

    2023年04月08日
    浏览(39)
  • 人工智能在图像处理中的应用:智能摄像头与视觉识别

    人工智能(Artificial Intelligence, AI)是一种计算机科学的分支,旨在模拟人类智能的行为和能力。其中,图像处理和视觉识别是人工智能领域中的重要应用领域。随着计算能力的提高和数据量的增加,人工智能在图像处理和视觉识别方面取得了显著的进展。 智能摄像头是一种具有

    2024年02月20日
    浏览(64)
  • jetson nano 智能小车1.0(实现键盘控制、加装摄像头)

    实验剩了一个jetson nano 开发板,闲着也是闲着,拿过来搞点好玩的,jetson nano 和树莓派差不多,加个L298N电机驱动板模块,买两个直流电机就行,目前图省事儿使用无线键盘控制,缺点是不知道程序目前的执行状态,后面考虑加个led指示灯 1.1主要硬件 jetson nano主控板一个 L2

    2024年04月25日
    浏览(43)
  • 毕业设计:基于深度学习的摄像头人脸识别系统 人工智能

    目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 人脸检测技术 1.2 活体检测技术 二、 数据集 2.1 数据集 2.2 数据扩充 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就

    2024年04月27日
    浏览(59)
  • 边缘计算AI智能盒子的视频源必须是固定点监控摄像头吗?

    边缘计算AI盒子的视频输入源,要求是RTSP或者GB28181,可以是固定点监控摄像头(枪机、球机等),也可以是移动摄像头,例如执法记录仪、智能安全帽、布控球等,但由于RTSP输入要求摄像头有固定IP,而4G/5G拨号的移动摄像头是无法提供固定IP的,因此,这种情况下,可以不

    2024年02月04日
    浏览(52)
  • 用AI技术提高智能安防摄像头的鲁棒性和安全性

    作者:禅与计算机程序设计艺术 随着人工智能技术的飞速发展,智能安防摄像头作为其应用场景之一,得到了越来越广泛的应用。然而,智能安防摄像头在面临各种挑战时,如图像识别、目标检测、运动跟踪等,依然存在许多的鲁棒性和安全性问题。为了解决这些问题,本文

    2024年02月06日
    浏览(41)
  • 方案|AI智能监控如何从区域入侵与摄像头异常方面助力野外农场安全监管

    大家都知道,旭帆科技的AI分析算法在监控中的应用十分广泛,除了常见的人体事件、行为事件、着装、车辆等算法,摄像头异常检测也十分重要。近期就有一个用户在我们这定制了一个野外摄像头异常检测算法系统。 该用户的需求为需要在自己野外农场中配备区域入侵与摄

    2024年02月20日
    浏览(50)
  • 关于TC264单片机与智能车摄像头循迹的一些学习心得

    前言:最近一段时间在准备智能车考核,其中要求使用TC264单片机实现PID控制的小车摄像头循迹。其中关于PID的部分在之前我已经上传过了,这篇文章主要讲怎么实现循迹与舵机的位置式PID调参和电机的增量式调参的一些心得。 一、摄像头循迹的实现 首先我们要明白英飞凌公

    2024年02月04日
    浏览(43)
  • 7款家用智能摄像头横评:小米、乐橙、TP-LINK、海康威视、360、智汀、华为

    相信很多人都买过家用监控摄像头,有的是为了及时查看家里的老人孩子的动态,有的是为了看家里宠物,遇到小偷时还能拍下面貌。但市场上五花八门的监控摄像头,各种功能让人看花了眼。 于是呢?为了让大家更了解智能摄像头,今天我们来测下市面上比较靠前小米、乐

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包