智能车摄像头边界跟踪(八近邻)

下面展示一些 内联代码片

// 智能车摄像头边界跟踪
// 边界跟踪
#include "boundary_following.h"

void boundary_following(uint8*image,uint8*image_border)  //image为二值化后图像,image_border为计算后得到图像64*94
{ 
    int i=63,j,dir_left=2,dir_right=2;
    int x,y;
    int border_left,border_right;
    int times = 1000;
    //------------------------第一步确定起始点------------------------------------------------//
    //确定起始点。根据光栅扫描,发现第一个象素值为1的点为起始点,存储其坐标值
    for(y=0;y<64;y++) //clear
        for(x=0;x<94;x++)
            image_border[y][x]=0;
    
    for(j = 0;j<94;j++)
    {
        if(image[63][j]==1 && image[63][j+1]==1 && image[63][j+2]==1 && image[63][j+3]==1)
        {
            border_left = j;
            break;
        }
    }
    for(j=93;j>=0;j--)
    {
        if(image[63][j]==1 && image[63][j-1]==1 && image[63][j-2]==1 && image[63][j-3]==1)
        {
            border_right = j;
            break;
        }
    }
    i = 63;
    j = border_left;

    y = 63;
    x = border_right;
    //--------------------------第二步研究邻域点-----------------------------------------------------------//
    //从起点的0邻域点开始,逆时针方向研究其8邻域点值,找到第一个象素值为1的点,存储其坐标值
    //left
    //循环做下去   >=62 && border_right+-2
    while(times>0)
    {
        //left
          switch(dir_left%8)
        {
            case 0: {i+=1;j =j;};break;
            case 1: {i+=1;j-=1;};break;
            case 2: {i =i;j-=1;};break;
            case 3: {i-=1;j-=1;};break;
            case 4: {i-=1;j =j;};break;
            case 5: {i-=1;j+=1;};break;
            case 6: {i =i;j+=1;};break;
            case 7: {i+=1;j+=1;};break;
            default:{};break;
        }
        if(image[i][j]==1)
        {
            image_border[i][j] = 1; //找到边界
            if(dir_left%2==0)
            dir_left = (dir_left+7)%8;
            else
            dir_left = (dir_left+6)%8;
        }
        else
        {
            if(dir_left<8)
            dir_left++; 
            else
            {
            }
        }

        //right
          switch(dir_right%8)
        {
            case 0: {y+=1;x =x;};break;
            case 7: {y+=1;x-=1;};break;
            case 6: {y =y;x-=1;};break;
            case 5: {y-=1;x-=1;};break;
            case 4: {y-=1;x =x;};break;
            case 3: {y-=1;x+=1;};break;
            case 2: {y =y;x+=1;};break;
            case 1: {y+=1;x+=1;};break;
            default:{};break;
        }
        if(image[y][x]==1)
        {
            image_border[y][x] = 1; //找到边界
            if(dir_right%2==0)
            dir_right = (dir_right+7)%8;  //来自边界跟踪法
            else
            dir_right = (dir_right+6)%8;
        }
        else
        {
            if(dir_right<8)
            dir_right++; 
            else
            {}
        }

        if(i==y&&j==x)break;
         times--;
    }   
}
  • 6
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从FFT学起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值