下面展示一些 内联代码片
。
// 智能车摄像头边界跟踪
// 边界跟踪
#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--;
}
}