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

下面展示一些 内联代码片

// 智能车摄像头边界跟踪
// 边界跟踪
#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--;
    }   
}

你可能感兴趣的:(智能车,计算机视觉)