原理
先找到一個白點A,然后向右找到黑點,記錄黑點的位置,以當前黑點的豎坐標位置向上判斷,上面的點是什么點,如果為黑點向左找白點,如果為白點向右找黑點(找到邊界點),然后接着以當前豎坐標位置判斷上面的點...就這樣設計的
總體思想是這樣,但是並不是簡單如此,有幾個特殊的處理
沒寫完呢
int zhidao_flage=0; int goto_cross=0; int xieshizi_among=0;//斜十字中間 int xieshizi__cnt=0;//斜十字 int start=0;//從哪里開始求平均 int stop=0;// int avg=0;//黑線中點平均位置 int flage=0,flag=0; int i=0,j=0,copy_j=0,among=0,up=0; int right[40]={0,0};//右邊界記錄數組---行列記錄 /*左邊緣*/ int ii=0,iii=0; int left_flage=0,left_flag=0; int left_i=0,left_j=0,left_copy_j=0,left_among=0,left_up=0; int left[40]={0,0}; //左邊界記錄數組---行列記錄 return_left_max=0; return_left_min=0; left_carry = 0; /*左邊緣*/ return_right_max = 0;//右邊界最高點 return_right_min = 0;//右邊界最低點 right_carry = 0; //運行標志位 // printf("left********"); //左邊界 /*先找到起始點*/ //中 //上 //左 右 if(image[38][40] > thresh && image[37][40] > thresh &&image[38][39] > thresh &&image[38][41] > thresh)//所選點為白點 { // peedPid -> SetPoint = 20;//設置起始速度為 if(image[38][40] > thresh) { for(left_i=40;left_i>0;left_i--) { if(image[38][left_i] < thresh) { left_flage = 1; //標志位置一 left_carry = 1; //運行標志位置一 left[38] = left_i; //記錄當前位置 left_copy_j = 38; //把最低位置傳遞給下面的函數 // left_lie[i]=copy_j; //第i行的邊界是copy_j return_left_min = 38; //左邊界最低點 break; } } } if(left_flage == 0)//左邊上上找 { for(left_j=38;left_j>16;left_j--) { if(image[left_j][1] < thresh) { if(left_j<30) { for(ii=38;ii>20;ii--) { if(image[ii][40]<thresh) { left_carry = 0; return_left_max = 0; return_left_min = 0; goto diuxian1; } } } // if(image[left_j][4] >thresh&&image[left_j][6] >thresh&&image[left_j][8] >thresh) // { // if(image[left_j-1][6] >thresh&&image[left_j-1][8] >thresh&&image[left_j-1][10] >thresh) // { left_copy_j = left_j; //把最低位置傳遞給下面的函數 // left_lie[i]=copy_j; //第i行的邊界是copy_j left_flage = 1; //標志位置一 left_carry = 1; //運行標志位置一 left[left_j] = left_i; //記錄當前位置 return_left_min = left_j;//左邊界最低點 break; // } // } } } } if(left_flage==1) { for(left_j = left_copy_j; left_j>1; left_j --) { left_among = left[left_j];//記錄現在點的x坐標 left_up = left_j - 1; //上 if(left_up < 0) left_up = 0; if(*(*(image+left_up)+left_among)>thresh)//如果上面是白點 { left_flag = 0; // printf("111111111111"); for(left_i = left_among; left_i >1; left_i --)//向左找黑色邊緣 { // if(left_i <0) // { // left_i=0; // } if(image[left_up][left_i] < thresh)//容差大於delta--找到 { left_flag = 1;//找到邊緣標志 left[left_up] = left_i;//記錄 // left_lie[i]=up; //第i行的邊界是up // printf("22222222222"); break; } } } else { // printf("aaaaaaaaaaaaa"); left_flag = 0; for(left_i = left_among; left_i<78; left_i ++)//向右找白色邊緣 { // if(left_i>79) // { // left_i=79; // } if(image[left_up][left_i] > thresh)//容差大於delta--找到 { left_flag = 1;//找到邊緣標志 left[left_up] = left_i;//記錄 // left_lie[i]=up; //第i行的邊界是up // printf("bbbbbbbbbbbbb"); break; } } } if(left_flag==0) { // printf("jkfhuidasf"); return_left_max = left_j+1; break; } else { return_left_max = left_j+1;//返回函數檢測的最高點 // printf("jkfhuidasf"); } } // printf("return_left=%d\r\n",return_left_max); // printf("return_left_max==%d\r\n",left[return_left_max]); // for(ii = 0;ii<40;ii++) // { // printf("%d",ii); // printf("==%d\r\n",left[ii]); // } } diuxian1: /*右邊界************************************************/ if(image[38][40] > thresh)//所選點為白點 { for(i=40;i<78;i++)//向右找黑點 { if(image[38][i] < thresh)//找到黑點 { flage = 1; //標志位置一 right_carry = 1; //運行標志位置一 right[38] = i; //記錄當前位置--第38行的邊界是i copy_j = 38; //把最低位置傳遞給下面的函數 // right_lie[i]=copy_j; //第i列的邊界是copy_j return_right_min = 38;//右邊界最低點 break; } } } if(flage == 0)//上面沒找到邊界 { return_right_min=0; for(j=38;j>16;j--)//向上找10行 { if(image[j][77] < thresh)//如果找到邊界 { // if(image[j][74] >thresh&&image[j][71] >thresh&&image[j][68] >thresh) // { // if(image[j-1][72] >thresh&&image[j-1][70] >thresh&&image[j-1][68] >thresh) // { if(j<30) { for(ii=38;ii>20;ii--) { if(image[ii][40]<thresh) { // printf("****%d",ii); right_carry = 0; return_right_max = 0; return_right_min = 0; goto diuxian2; } } } flage = 1; //標志位置一 right_carry = 1; //運行標志位置一 right[j] = i; //記錄當前位置 copy_j = j; //把最低位置傳遞給下面的函數 // right_lie[i]=copy_j; //第i列的邊界是copy_j return_right_min = j; //右邊界最低點 break; // } // } } } } if(flage==1) { for(j = copy_j; j>1; j --) { among = right[j];//記錄現在點的x坐標 up = j - 1; //上 if(up < 0) up = 0; if(*(*(image+up)+among)>thresh)//如果上面是白點 { flag = 0; for(i = among; i < 78; i ++)//向右找黑色邊緣 { // if(i>79) // { // i=79; // } if(image[up][i] < thresh)//容差大於delta--找到 { flag = 1;//找到邊緣標志 right[up] = i;//記錄 // right_lie[i]=up; //第i列的邊界是up break; } } } else { flag = 0; for(i = among; i > 1; i --)//向左找白色邊緣 { // if(i<0) // { // i=0; // } if(image[up][i] > thresh)//容差大於delta--找到 { flag = 1;//找到邊緣標志 right[up] = i;//記錄 // right_lie[i]=up; //第i列的邊界是up break; } } } if(flag==0) { return_right_max = j+1;//返回函數檢測的最高點 // printf("j==%d\r\n",j); break; } else { return_right_max = j+1;//返回函數檢測的最高點 // printf("j==%d\r\n",j); } } // printf("return_right_max==%d\r\n",return_right_max); // printf("return_right_max==%d\r\n",right[return_right_max]); // for(ii = 0;ii<40;ii++) // { // printf("%d",ii); // printf("==%d\r\n",right[ii]); // } } diuxian2: