前言

这篇文章主要讲述智能车竞赛中如何判断车库。

一、函数主体

/*
车库核心思路讲解:
车库的判别分为两大部分  第一部分是判别元素中存在车库  第二部分是特殊的扫线模式
第一部分讲解: 判别是否存在车库 主要是这种语句
if (Pixels[i][ j] == 0 && Pixels[i][ j + 1] == 0 && Pixels[i][ j + 2] == 1 && Pixels[i][ j + 3] == 1)寻找的是斑马线的黑白跳变,当存在基础的黑白跳变之后 我们要寻找宽度的变化宽度的变化:车库因为有斑马线的存在,所以宽度的体现会是宽-窄-宽 ,其主要语句是(注意这里的big-smal-big)
for (i = 1; i < break_hangshu; i++)
{if (calkuan[i] > 90){kuandubig1 = i;//    SetText("equal第一个 " + i);break;}
}
if (kuandubig1 != 0)
{for (i = kuandubig1; i < break_hangshu; i++){if (calkuan[i] <= 65&&L_black[i]!=186&&R_black[i]!=0){kuandusmall1 = i;//     SetText("equal第二个 " + i);break;}}}
if (kuandusmall1 != 0)
{for (i = kuandusmall1; i < break_hangshu; i++){if (calkuan[i] >= 76&& calkuan[i] <=150){kuandubig2 = i;//   SetText("equal第三个 " + i);break;}}}好的,如果你上面两步都理解完了,下面我们进入车库的特殊扫线模式。
首先要指出的当你出库的时候,你是知道将来库的方向的。比如常规跑法,右边出库,那么将来车库一定是在右边。
当满足上方两个条件(黑白跳变,宽度变化)的时候,假设是右方车库,有下面的操作:
(1)单独去扫右边线,从93往右扫线,扫到第一行的右线之后,以此为基准把右边线都扫出来。(方法是行数增加一行,列数往右退大约5列然后再去向左扫线。)
(2)右边线完整之后,我们通过从右线往左线扫线获得基本完整的左边线。
(3)完整的右线和有空行的左边线都扫出来之后,下面就是找左边线的上下拐点拉线,然后左加右除以二计算中线。如果不入库,就判长直道冲刺。如果入库拉线即可。
(4)关键是将有效的左右线扫出来,下面找拐点拉线的操作我觉得大家都已经写到车库元素了,很容易拿下。
*/
void mynewleftku()
{int i;int j;int kuandubig1 = 0;int kuandusmall1 = 0;int kuandubig2 = 0;kukuanduequal = 0;int leftku1 = 0;int leftku1next = 0;int leftku2 = 0;int leftku2next = 0;int leftku3 = 0;int leftku3next = 0;int leftku4 = 0;int leftku4next = 0;int leftku5 = 0;int leftku5next = 0;
//threemode=12;  //暂时加上  千万注意
for (i = 1; i < break_hangshu; i++)
{if (calkuan[i] > 90){kuandubig1 = i;//    SetText("equal第一个 " + i);break;}
}
if (kuandubig1 != 0)
{for (i = kuandubig1; i < break_hangshu; i++){if (calkuan[i] <= 65&&L_black[i]!=186&&R_black[i]!=0){kuandusmall1 = i;//     SetText("equal第二个 " + i);break;}}}
if (kuandusmall1 != 0)
{for (i = kuandusmall1; i < break_hangshu; i++){if (calkuan[i] >= 76&& calkuan[i] <=150){kuandubig2 = i;//   SetText("equal第三个 " + i);break;}}}if (kuandubig1 != 0 && kuandusmall1 != 0 && kuandubig2 != 0 && turepodaoflag == 0 && ((huandao_memory == 0 && huandao_memoryforleft == 0) || (huandao_memory == 1) || (huandao_memory == 2) || (huandao_memory==3) || (huandao_memoryforleft == 1)|| (huandao_memoryforleft == 2)|| (huandao_memoryforleft == 3))  ){kukuanduequal = 1;}firstku = 0;kurightdownflag = 0;  //初步找一遍kuleftdownflag = 0;kurightupflag = 0;kuleftupflag = 0;find_kurightdown_point(5, 35);find_kuleftdown_point(5, 35);find_kuleftup_point(3, 40);find_kurightup_point(3, 40);if (kukuanduequal == 1 && (kurightdownflag == 1|| kurightupflag==1) && (kuleftdownflag == 1|| kuleftupflag==1)){kumode = 1;// SetText("kumode " + kumode);}if (kukuanduequal == 1 && (kurightdownflag == 1 && kurightupflag == 1)){kumode = 1;// SetText("kumode " + kumode);}if (kukuanduequal == 1 && (kuleftdownflag == 1 && kuleftupflag == 1)){kumode = 1;//SetText("kumode " + kumode);}if ((threemode == 6||threemode==12) && type == 4 && kukuanduequal == 1  &&My_Abs( pianfangright ,pianfangleft )>= 230 && kurightdownflag == 1 && kuleftdownflag == 0&& kuright_turn_down[1]<=150&& turepodaoflag == 0 && huandao_memory == 0 && huandao_memoryforleft == 0 && firstmid == 0 && secondmid == 0&& (continueleft == 0 || continueright == 0) && break_hangshu <= 40){//  wankuflag = 1;//  truewankuflag=1;}if (wankuflag == 1){if (R_black[0] != 0 && R_black[1] != 0 && R_black[2] != 0 && R_black[3] != 0 && R_black[4] != 0 && R_black[5] != 0){advanced_regression(2, 1, 3, 4, 5);R_blackfuzhi(parameterA, parameterB, 0, 50);}else{for (i = 0; i < 50; i++){R_black[i] = 0;}}if(L_black[0]!=186&& L_black[1] != 186 && L_black[2] != 186 && L_black[3] != 186 && L_black[4] != 186 && L_black[5] != 186){advanced_regression(1, 1, 3, 4, 5);leftlinefuzhi(parameterA, parameterB, 0, 50);}else{for (i = 0; i < 50; i++){L_black[i] = 186;}}zhongxianfuzhi(0, 50);kumode = 1;}if ((threemode == 6 || threemode == 12) && type == 3 && kukuanduequal == 1 && My_Abs(pianfangright, pianfangleft) >= 230 && kurightdownflag == 0 && kuleftdownflag == 1 && kuleft_turn_down[1] >=5&& turepodaoflag == 0 && huandao_memory == 0 && huandao_memoryforleft == 0 && firstmid == 0 && secondmid == 0&& (continueleft == 0 || continueright == 0) && break_hangshu <= 40){//  wankuflag = 2;// truewankuflag=1;}if (wankuflag == 2){if (R_black[0] != 0 && R_black[1] != 0 && R_black[2] != 0 && R_black[3] != 0 && R_black[4] != 0 && R_black[5] != 0){advanced_regression(2, 1, 3, 4, 5);R_blackfuzhi(parameterA, parameterB, 0, 50);}else{for (i = 0; i < 50; i++){R_black[i] = 0;}}if (L_black[0] != 186 && L_black[1] != 186 && L_black[2] != 186 && L_black[3] != 186 && L_black[4] != 186 && L_black[5] != 186){advanced_regression(1, 1, 3, 4, 5);leftlinefuzhi(parameterA, parameterB, 0, 50);}else{for (i = 0; i < 50; i++){L_black[i] = 186;}}zhongxianfuzhi(0, 50);kumode = 1;}if (kumode == 1||kumode==2)  //基本模式试着扫斑马线{recordhang = 40;haveleftku = 0;leftkuhang = 0;for (i = 0; i < recordhang; i++){leftku1 = 0;leftku1next = 0;leftku2 = 0;leftku2next = 0;leftku3 = 0;leftku3next = 0;leftku4 = 0;leftku4next = 0;leftku5 = 0;leftku5next = 0;for (j = 30; j < 150; j++){if (Pixels[i][ j] == 0 && Pixels[i][ j + 1] == 0 && Pixels[i][ j + 2] == 1 && Pixels[i][ j + 3] == 1){leftku1 = 1;leftku1next = j + 4;break;}}if (leftku1next != 0){for (j = leftku1next; j < 150; j++){if (Pixels[i][ j] == 0 && Pixels[i][ j + 1] == 0 && Pixels[i][ j + 2] == 1 && Pixels[i][ j + 3] == 1){leftku2 = 1;leftku2next = j + 4;break;}}}if (leftku2next != 0){for (j = leftku2next; j < 150; j++){if (Pixels[i][ j] == 0 && Pixels[i][ j + 1] == 0 && Pixels[i][ j + 2] == 1 && Pixels[i][ j + 3] == 1){leftku3 = 1;leftku3next = j + 4;break;}}}if (leftku3next != 0){for (j = leftku3next; j < 150; j++){if (Pixels[i][ j] == 0 && Pixels[i][ j + 1] == 0 && Pixels[i][j + 2] == 1 && Pixels[i][ j + 3] == 1){leftku4 = 1;leftku4next = j + 4;break;}}}if (leftku4next != 0){for (j = leftku4next; j < 150; j++){if (Pixels[i][j] == 0 && Pixels[i][j + 1] == 0 && Pixels[i][ j + 2] == 1 && Pixels[i][j + 3] == 1){leftku5 = 1;leftku5next = j + 4;break;}}}if (leftku1 == 1 && leftku2 == 1 && leftku3 == 1 && leftku4 == 1 && leftku5 == 1){haveleftku = 1;leftkuhang = i;recordhang = i + 7;break;}}}if (haveleftku == 1 && leftkuhang != 0){kumode = 2;if (huandao_memory != 0) { huandao_memory = 0; huandaojishu = huandaojishu - 1; }if (huandao_memoryforleft != 0) { huandao_memoryforleft = 0; huandaojishu = huandaojishu - 1; }}if (kumode==2){wankuflag = 0;truewankuflag=0;}
//    if (kumode == 2)//   {//       wankuflag = 0;//       truewankuflag=0;//   }if (haveleftku == 0){kumode = 0;}//type = 3;// type = 4;int hang, lie;//重新扫线左出左入开始if (kumode == 2 && type == 3){for (lie = 0; lie <184; lie++){if (lie >= (int)184) lie = 183;if ( Pixels[0][ lie] == 0 && Pixels[0][ lie + 1] == 1 && Pixels[0][ lie + 2] == 1) //黑白{R_black[0] = (unsigned char)(lie + 1);rightold = (int)(lie + 1);rightflag[0] = 1;break;}else{R_black[0] = 0;rightflag[0] = 0;}}for (hang = 1; hang < 50; hang++)  //1-70行扫右线{for (lie = R_black[hang - 1] - 2; lie < 184; lie++){if (lie <= 0) lie = 2;if (lie >= (int)184) lie = 183;if (Pixels[hang][ lie] == 0 && Pixels[hang][ lie + 1] == 1 && Pixels[hang][ lie + 2] == 1) //黑白{R_black[hang] = (unsigned char)(lie + 1);rightold = (int)(lie + 1);rightflag[hang] = 1;break;}else{R_black[hang] = 0;rightflag[hang] = 0;}}}for (hang = 0; hang < 50; hang++)  //1-70行扫右线{for (lie = R_black[hang]; lie < 184; lie++){if (lie >= (int)184) lie = 183;if (Pixels[hang][ lie] == 1 && Pixels[hang][ lie + 1] == 0 && Pixels[hang][ lie + 2] == 0)   //白黑{L_black[hang] = (unsigned char)(lie);leftold = (int16)(lie);leftflag[hang] = 1;break;}else{L_black[hang] = 186;leftflag[hang] = 0;}}}}if (kumode == 2 && type == 3&&threemode==6){firstku = 0;kuleftdownflag = 0;find_kuleftdown_point(5, 35);if (kuleftdownflag == 1){kuleftupflag = 0;if (kuleft_turn_down[0] >= 3 && kuleft_turn_down[0] <= 39){ find_kuleftup_point(kuleft_turn_down[0], 40); }else{find_kuleftup_point(3, 40);}}if (kuleftdownflag == 0){kuleftupflag = 0;find_kuleftup_point(3, 40);}if (kuleftdownflag == 1 && kuleftupflag == 1&& kuleft_turn_down[0]>=5){advanced_regression(1, kuleft_turn_down[0] - 5, kuleft_turn_down[0] - 3, kuleft_turn_up[0] + 2, kuleft_turn_up[0] + 4);leftlinefuzhi(parameterA, parameterB, 0, 50);int rightmax=0;for (i = kuleft_turn_up[0] + 2; i >= 1; i--){if (My_Abs(R_black[i], R_black[i - 1]) >= 5){rightmax = i;break;}}if (rightmax != 0){advanced_regression(2, rightmax+1, rightmax+2, rightmax+4, rightmax+5);R_blackfuzhi(parameterA, parameterB, 0, rightmax + 5);}firstku = 1;zhongxianfuzhi(0, 50);}if (kuleftdownflag == 0 && kuleftupflag == 1){advanced_regression(1, kuleft_turn_up[0]+1, kuleft_turn_up[0]+2, kuleft_turn_up[0] +4, kuleft_turn_up[0] + 5);leftlinefuzhi(parameterA, parameterB, 0, 50);int rightmax = 0;for (i = kuleft_turn_up[0] + 2; i >= 1; i--){if (My_Abs(R_black[i], R_black[i - 1]) >= 5){rightmax = i;break;}}if (rightmax != 0){advanced_regression(2, rightmax + 1, rightmax + 2, rightmax + 4, rightmax + 5);R_blackfuzhi(parameterA, parameterB, 0, rightmax + 5);}firstku = 1;zhongxianfuzhi(0, 50);}}if (kumode == 2 && type == 3&&rukuflag!=3&& threemode == 12){firstku = 0;kuleftdownflag = 0;find_kuleftdown_point(5, 35);if (kuleftdownflag == 1){kuleftupflag = 0;if (kuleft_turn_down[0] >= 3 && kuleft_turn_down[0] <= 39){ find_kuleftup_point(kuleft_turn_down[0], 40); }else{find_kuleftup_point(3, 40);}}if (kuleftdownflag == 0){kuleftupflag = 0;find_kuleftup_point(3, 40);}if (kuleftdownflag == 1 && kuleftupflag == 1 && kuleft_turn_up[0] >= 21&& kuleft_turn_down[0]>=5){advanced_regression(1, kuleft_turn_down[0] - 5, kuleft_turn_down[0] - 3, kuleft_turn_up[0] + 2, kuleft_turn_up[0] + 4);leftlinefuzhi(parameterA, parameterB, 0, 50);int rightmax = 0;for (i = kuleft_turn_up[0] + 2; i >= 1; i--){if (My_Abs(R_black[i], R_black[i - 1]) >= 5){rightmax = i;break;}}if (rightmax != 0){advanced_regression(2, rightmax + 1, rightmax + 2, rightmax + 4, rightmax + 5);R_blackfuzhi(parameterA, parameterB, 0, rightmax + 5);}zhongxianfuzhi(0, 50);if (kuleft_turn_up[0] > 35) rukuflag = 1;if (kuleft_turn_up[0]>=30&& kuleft_turn_up[0]<=35) rukuflag = 2;}if (kuleftdownflag == 0 && kuleftupflag == 1&& kuleft_turn_up[0] >= 21){advanced_regression(1, kuleft_turn_up[0] + 1, kuleft_turn_up[0] + 2, kuleft_turn_up[0] + 4, kuleft_turn_up[0] + 5);leftlinefuzhi(parameterA, parameterB, 0, 50);int rightmax = 0;for (i = kuleft_turn_up[0] + 2; i >= 1; i--){if (My_Abs(R_black[i], R_black[i - 1]) >= 5){rightmax = i;break;}}if (rightmax != 0){advanced_regression(2, rightmax + 1, rightmax + 2, rightmax + 4, rightmax + 5);R_blackfuzhi(parameterA, parameterB, 0, rightmax + 5);}zhongxianfuzhi(0, 50);if (kuleft_turn_up[0] > 35) rukuflag = 1;if (kuleft_turn_up[0] >= 30 && kuleft_turn_up[0] <= 35) rukuflag = 2;}if ((kuleftupflag == 1 && kuleft_turn_up[0] < 21)|| leftkuhang <= 11){for (i = 0; i < 50; i++){L_black[i] = 186;}R_black[kuleft_turn_up[0]] = (unsigned char)kuleft_turn_up[1];R_black[kuleft_turn_up[0]+1] = (unsigned char)(kuleft_turn_up[1]+3);R_black[0] = (unsigned char)0;R_black[2] = (unsigned char)3;advanced_regression(2, 0, 2, kuleft_turn_up[0], kuleft_turn_up[0] + 1);R_blackfuzhi(parameterA, parameterB, 0, 50);zhongxianfuzhi(0, 50);rukuflag = 3;for (i = 0; i < 50; i++){LCenterrecord[i] = LCenter[i];rightrecord[i] = R_black[i];leftrecord[i] = L_black[i];}}}//重新扫线左出左入结束//重新扫线右出右出开始if (kumode == 2 && type == 4){for (lie = 185; lie >=2; lie--){if ( Pixels[0][ lie] == 0 && Pixels[0][ lie - 1] == 1 && Pixels[0][ lie - 2] == 1){L_black[0] = (unsigned char)(lie - 1);leftold = (int)(lie - 1);leftflag[0] = 1;break;}else{L_black[0] = 186;leftflag[0] = 0;}}for (hang = 1; hang < 50; hang++)  //1-70行扫左线{for (lie = L_black[hang-1]+2; lie >=1; lie--)  //扫左线{if (lie <= 1) lie = 1;if (lie >= 184) lie = 184;if (Pixels[hang][ lie + 1] == 0 && Pixels[hang][ lie] == 0 && Pixels[hang][ lie - 1] == 1){L_black[hang] = (unsigned char)(lie - 1);leftold = (int)(lie - 1);leftflag[hang] = 1;break;}else{L_black[hang] = 186;leftflag[hang] = 0;}}}for (hang = 0; hang < 50; hang++)  //扫右线{for (lie = L_black[hang]; lie >= 1; lie--){if (lie >= (int)185) lie = 184;if (Pixels[hang][lie +1] == 1 && Pixels[hang][ lie] == 1 && Pixels[hang][lie - 1] == 0) //黑白{R_black[hang] = (unsigned char)(lie);rightold = (int16)(lie);rightflag[hang] = 1;break;}else{R_black[hang] = 0;rightflag[hang] = 0;}}}}if (kumode == 2 && type == 4 && threemode == 6)//&& threemode == 6{firstku = 0;kurightdownflag = 0;find_kurightdown_point(5, 35);if (kurightdownflag == 1){kurightupflag = 0;if (kuleft_turn_down[0] <= 39&& kuleft_turn_down[0]>=3){ find_kurightup_point(kuleft_turn_down[0], 40); }else{ find_kurightup_point(3, 40); }}if (kurightdownflag == 0){kurightupflag = 0;find_kurightup_point(3, 40);}if (kurightdownflag == 1 && kurightupflag == 1 && kuright_turn_down[0] >= 5) //{advanced_regression(2, kuright_turn_down[0] - 5, kuright_turn_down[0] - 3, kuright_turn_up[0] + 2, kuright_turn_up[0] + 4);R_blackfuzhi(parameterA, parameterB, 0, 50);int leftmax = 0;for (i = kuright_turn_up[0] + 2; i >= 1; i--){if (My_Abs(L_black[i], L_black[i - 1]) >= 5){leftmax = i;break;}}if (leftmax != 0){advanced_regression(1, leftmax + 1, leftmax + 2, leftmax + 4, leftmax + 5);leftlinefuzhi(parameterA, parameterB, 0, leftmax + 5);}zhongxianfuzhi(0, 50);firstku = 1;}if (kurightdownflag == 0 && kurightupflag == 1){advanced_regression(2, kuright_turn_up[0] + 1, kuright_turn_up[0] + 2, kuright_turn_up[0] + 4, kuright_turn_up[0] + 5);R_blackfuzhi(parameterA, parameterB, 0, 50);int leftmax = 0;for (i = kuleft_turn_up[0] + 2; i >= 1; i--){if (My_Abs(L_black[i], L_black[i - 1]) >= 5){leftmax = i;break;}}if (leftmax != 0){advanced_regression(1, leftmax + 1, leftmax + 2, leftmax + 4, leftmax + 5);leftlinefuzhi(parameterA, parameterB, 0, leftmax + 5);}zhongxianfuzhi(0, 50);firstku = 1;}}if (kumode == 2 && type == 4 && rukuflag != 3 && threemode == 12) //{firstku = 0;kurightdownflag = 0;find_kurightdown_point(5, 35);if (kurightdownflag == 1){kurightupflag = 0;if (kuleft_turn_down[0] <= 39&& kuleft_turn_down[0]>=3){ find_kurightup_point(kuleft_turn_down[0], 40); }else{ find_kurightup_point(3, 40); }}if (kurightdownflag == 0){kurightupflag = 0;find_kurightup_point(3, 40);}if (kurightdownflag == 1 && kurightupflag == 1 && kuright_turn_down[0] >= 5 && kuright_turn_up[0] >= 21) //{advanced_regression(2, kuright_turn_down[0] - 5, kuright_turn_down[0] - 3, kuright_turn_up[0] + 2, kuright_turn_up[0] + 4);R_blackfuzhi(parameterA, parameterB, 0, 50);int leftmax = 0;for (i = kuright_turn_up[0] + 2; i >= 1; i--){if (My_Abs(L_black[i], L_black[i - 1]) >= 5){leftmax = i;break;}}if (leftmax != 0){advanced_regression(1, leftmax + 1, leftmax + 2, leftmax + 4, leftmax + 5);leftlinefuzhi(parameterA, parameterB, 0, leftmax + 5);}zhongxianfuzhi(0, 50);if (kuright_turn_up[0] > 35) rukuflag = 1;if (kuright_turn_up[0] >= 30 && kuright_turn_up[0] <= 35) rukuflag = 2;}if (kurightdownflag == 0 && kurightupflag == 1 && kuright_turn_up[0] >= 21){advanced_regression(2, kuright_turn_up[0] + 1, kuright_turn_up[0] + 2, kuright_turn_up[0] + 4, kuright_turn_up[0] + 5);R_blackfuzhi(parameterA, parameterB, 0, 50);int leftmax = 0;for (i = kuleft_turn_up[0] + 2; i >= 1; i--){if (My_Abs(L_black[i], L_black[i - 1]) >= 5){leftmax = i;break;}}if (leftmax != 0){advanced_regression(1, leftmax + 1, leftmax + 2, leftmax + 4, leftmax + 5);leftlinefuzhi(parameterA, parameterB, 0, leftmax + 5);}zhongxianfuzhi(0, 50);if (kuright_turn_up[0] > 35) rukuflag = 1;if (kuright_turn_up[0] >= 30 && kuright_turn_up[0] <= 35) rukuflag = 2;}if ( (kurightupflag == 1 && kuright_turn_up[0]< 21)||leftkuhang<=11){for (i = 0; i < 50; i++){R_black[i] = 0;}L_black[kuright_turn_up[0]] = (unsigned char)kuright_turn_up[1];L_black[kuright_turn_up[0] + 1] = (unsigned char)(kuright_turn_up[1]-3);L_black[0] = (unsigned char)186;L_black[2] = (unsigned char)183;advanced_regression(1, 0, 2, kuright_turn_up[0], kuright_turn_up[0] + 1);leftlinefuzhi(parameterA, parameterB, 0, 50);zhongxianfuzhi(0, 50);rukuflag = 3;for (i = 0; i < 50; i++){LCenterrecord[i] = LCenter[i];rightrecord[i] = R_black[i];leftrecord[i] = L_black[i];}}}//重新扫线右出右入结束if (rukuflag == 3){for (i = 0; i < 50; i++){LCenter[i] = (unsigned char)LCenterrecord[i];R_black[i] = (unsigned char)rightrecord[i];L_black[i] = (unsigned char)leftrecord[i];}}if (countfirstku != 0) countfirstku = countfirstku + 1; //第一次入库保护if (countfirstku == 5) countfirstku = 0;if (firstku == 0 && lastfirstku == 1) countfirstku = 1;lastfirstku = firstku;
}

二、辅助函数

void find_kurightdown_point(int start_point, int end_point)//得到拐点的行与列 int{int j;if (end_point >= break_hangshu) end_point = break_hangshu - 2;for (j = start_point; j <= end_point; j++){if (My_Abs(R_black[j - 3], R_black[j - 2]) <= 3 && My_Abs(R_black[j - 2], R_black[j - 1]) <= 3 && My_Abs(R_black[j - 1], R_black[j]) <= 3 && My_Abs(R_black[j], R_black[j + 1]) >= 6 && ((L_black[j]-R_black[j]>40&&j<25)||j>=25)&&(R_black[j+1]<=10|| R_black[j + 2] <= 10 || R_black[j + 3] <= 10 || R_black[j + 4] <= 10|| (My_Abs(R_black[j], R_black[j+4])>=30&& R_black[j + 4]!=0))&& rightflag[j - 3] == 1 && rightflag[j - 2] == 1 && rightflag[j - 1] == 1 && rightflag[j] == 1) //样本为4行,图变差据{int record = 0;int i;record = j;for (i = j; i >= 1; i--){if (R_black[i] == R_black[i - 1]) record = i - 1;if (R_black[i] != R_black[i - 1]) break;}kuright_turn_down[0] = (int)(record);//数组里面没有第0行kuright_turn_down[1] = R_black[record];kurightdownflag = 1;break;                //记住具体的行与列}}}void find_kuleftdown_point(int start_point, int end_point){int j;if (end_point >= break_hangshu) end_point = break_hangshu - 2;for (j = start_point; j <= end_point; j++){if (My_Abs(L_black[j - 3], L_black[j - 2]) <= 3 && My_Abs(L_black[j - 2], L_black[j - 1]) <= 3 && My_Abs(L_black[j - 1], L_black[j]) <= 3 && (My_Abs(L_black[j], L_black[j + 1]) >= 6||(My_Abs(L_black[j], L_black[j + 1]) >= 4 && L_black[j + 1]==186)) && ((L_black[j] - R_black[j] > 40 && j < 25) || j >= 25)&& (L_black[j + 1] >=175 || L_black[j + 2] >= 175 || L_black[j + 3] >= 175 || L_black[j + 4] >= 175 || (My_Abs(L_black[j ], L_black[j+4])>=30&& L_black[j + 4]!=0))&& leftflag[j - 3] == 1 && leftflag[j - 2] == 1 && leftflag[j - 1] == 1 && leftflag[j] == 1&& L_black[j]>=60) //样本为4行,图变差据{int record = 0;int i;record = j;for (i = j; i >= 1; i--){if (L_black[i] == L_black[i - 1]) record = i - 1;if (L_black[i] != L_black[i - 1]) break;}kuleft_turn_down[0] = (int)(record);//数组里面没有第0行kuleft_turn_down[1] = L_black[record]; //记住行与列kuleftdownflag = 1;break; //找到突变点之后就跳出}}}void find_kurightup_point(int start_point, int end_point){int j;//for (j = end_point; j >= start_point; j--)for (j = start_point; j <= end_point; j++){if (My_Abs(R_black[j + 2], R_black[j + 1]) <= 4 && My_Abs(R_black[j + 1], R_black[j]) <= 4 && My_Abs(R_black[j + 3], R_black[j + 2]) <= 4 && My_Abs(R_black[j], R_black[j - 1]) >= 5 && R_black[j] <=93&& rightflag[j] == 1 && rightflag[j + 1] == 1 && rightflag[j + 2] == 1 && rightflag[j + 3] == 1&&R_black[j]>=3) //样本为4行,图变差据{int record = 0;int i;record = j;for (i = j; i >= 1; i--){if (R_black[i] == R_black[i - 1]) record = i - 1;if (R_black[i] != R_black[i - 1]) break;}kuright_turn_up[0] = (int)(record);//数组里面没有第0行kuright_turn_up[1] = R_black[record]; //记住行与列kurightupflag = 1;break; //找到突变点之后就跳出}}}void find_kuleftup_point(int start_point, int end_point){int j;//for (j = end_point; j>= start_point; j--)for (j = start_point; j <= end_point; j++){if (My_Abs(L_black[j+2], L_black[j+1]) <= 4 && My_Abs(L_black[j+1], L_black[j]) <= 4 && My_Abs(L_black[j +3], L_black[j+2]) <= 4 && My_Abs(L_black[j], L_black[j -1]) >= 5&&L_black[j]>=93&& leftflag[j] == 1 && leftflag[j+1] == 1 && leftflag[j+2] == 1 && leftflag[j+3] == 1&&L_black[j]<=183) //样本为4行,图变差据{int record = 0;int i;record = j;for (i = j; i >= 1; i--){if (L_black[i] == L_black[i - 1]) record = i - 1;if (L_black[i] != L_black[i - 1]) break;}kuleft_turn_up[0] = (int)(record);//数组里面没有第0行kuleft_turn_up[1] = L_black[record]; //记住行与列kuleftupflag = 1;break; //找到突变点之后就跳出}}}
void advanced_regression(int type, int startline1, int endline1, int startline2, int endline2)
{int i = 0;int sumlines1 = endline1 - startline1;int sumlines2 = endline2 - startline2;int sumX = 0;int sumY = 0;float averageX = 0;float averageY = 0;float sumUp = 0;float sumDown = 0;if (type == 0)  //拟合中线{/**计算sumX sumY**/for (i = startline1; i < endline1; i++){sumX += i;sumY += LCenter[i];}for (i = startline2; i < endline2; i++){sumX += i;sumY += LCenter[i];}averageX =(float)( sumX / (sumlines1 + sumlines2));     //x的平均值averageY = (float)(sumY / (sumlines1 + sumlines2));     //y的平均值for (i = startline1; i < endline1; i++){sumUp += (LCenter[i] - averageY) * (i - averageX);sumDown += (i - averageX) * (i - averageX);}for (i = startline2; i < endline2; i++){sumUp += (LCenter[i] - averageY) * (i - averageX);sumDown += (i - averageX) * (i - averageX);}if (sumDown == 0) parameterB = 0;else parameterB = sumUp / sumDown;parameterA = averageY - parameterB * averageX;}else if (type == 1)     //拟合左线{/**计算sumX sumY**/for (i = startline1; i < endline1; i++){sumX += i;sumY += L_black[i];}for (i = startline2; i < endline2; i++){sumX += i;sumY += L_black[i];}averageX =(float)( sumX / (sumlines1 + sumlines2));     //x的平均值averageY = (float)(sumY / (sumlines1 + sumlines2));     //y的平均值for (i = startline1; i < endline1; i++){sumUp += (L_black[i] - averageY) * (i - averageX);sumDown += (i - averageX) * (i - averageX);}for (i = startline2; i < endline2; i++){sumUp += (L_black[i] - averageY) * (i - averageX);sumDown += (i - averageX) * (i - averageX);}if (sumDown == 0) parameterB = 0;else parameterB = sumUp / sumDown;parameterA = averageY - parameterB * averageX;}else if (type == 2)         //拟合右线{/**计算sumX sumY**/for (i = startline1; i < endline1; i++){sumX += i;sumY += R_black[i];}for (i = startline2; i < endline2; i++){sumX += i;sumY += R_black[i];}averageX =(float)( sumX / (sumlines1 + sumlines2));     //x的平均值averageY = (float)(sumY / (sumlines1 + sumlines2));     //y的平均值for (i = startline1; i < endline1; i++){sumUp += (R_black[i] - averageY) * (i - averageX);sumDown += (i - averageX) * (i - averageX);}for (i = startline2; i < endline2; i++){sumUp += (R_black[i] - averageY) * (i - averageX);sumDown += (i - averageX) * (i - averageX);}if (sumDown == 0) parameterB = 0;else parameterB = sumUp / sumDown;parameterA = averageY - parameterB * averageX;}}
//求两数之差绝对值开始
int My_Abs(int a, int b)
{if ((a - b) > 0)return ((int)(a - b));else return ((int)(b - a));
}
//求两数之差绝对值结束void leftlinefuzhi(float A, float B, int8 start_point, int8 end_point)
{int8 m;for (m = start_point; m <= end_point; m++){if((B * m + A)>=255) L_black[m]=255;if((B * m + A)<=0) L_black[m]=0;else if(0<(B * m + A)&&(B * m + A)<255)L_black[m] = (int8)(B * m + A);}
}void R_blackfuzhi(float A, float B, int8 start_point, int8 end_point)
{int8 m;for (m = start_point; m <= end_point; m++){if ((B * m + A) < 0) {R_black[m] = 0; }else if((B * m + A) >=0&&(B * m + A)<=255) R_black[m] = (int8)(B * m + A);if((B * m + A)>=255) R_black[m]=255;}
}void zhongxianfuzhi( int8 start_point, int8 end_point){int8 m;for (m = start_point; m <= end_point; m++){LCenter[m] = (int8)(L_black[m]/2 + R_black[m]/ 2);}}

总结
根据出库不同的

type,进入不同模式

的车库判断。代码运行成功,就可以成功判断车库并且补线。

智能车图像处理7-车库的判断相关推荐

  1. 智能车图像处理18-三叉路口辅助判断

    前言 希望大家多多点赞评论收藏哦,不懂的地方评论区留言就好. 这篇文章主要讲述智能车竞赛中如何在判断三叉路口前进行一些辅助条件准备. 一.函数主体 思路讲解: 这里为了辅助三岔路口的判断,首先去寻找了 ...

  2. 【第十七届智能车】智能车图像处理(2)-赛道边界的简单提取和无元素循迹

    本博客使用的图像是188*120的大津法二值化图像.摄像头安装高度为25cm(离地),前瞻长度约1m. 智能车图像处理的过程就是读取输入的图像,经过处理后向控制部分输出一个偏差值,控制部分根据再这个偏 ...

  3. 智能车图像处理8-右环岛状态机与补线

    前言 这篇文章主要讲述智能车竞赛中如何判断右环岛并且进行状态补线. 一.函数主体 /* 注释1:环岛的八个状态 环岛分为八个状态.以右环岛为例,一二三状态都在未入环的直道上,这时候需要把右环岛的 中拐 ...

  4. 【第十七届智能车】智能车图像处理(1)-图像预处理

    本博客使用的硬件是逐飞总钻风130°无畸变摄像头,采用的图像分辨率为188*120,主控为CH32V307VCT6,使用DVI接口进行连接. 前言 我们在本次比赛中采用的是头尾车总钻风摄像头+中间车线 ...

  5. 智能车图像处理-阳光算法

    阳光算法见仁见智,多阈值OSTU和模糊OSTU是我参考论文进行改进的,整篇内容都放进了我的本科毕业论文中. 感谢大家的留言和指正,首先,这个算法经过实践,确实存在问题,因为当时毕业比较忙,我在智能车上 ...

  6. 智能车图像处理逆透视教程

    去畸变请参考:图像处理去畸变教程_LoseHu的博客-CSDN博客 去畸变+逆透视请参考:​​​​​​​​​​​​​​​​​​​​​智能车去畸变+逆透视教程_LoseHu的博客-CSDN博客 逆透视: ...

  7. 智能车图像处理之透视变换

    透视变换介绍 透视变换被广泛应用于投影仪器.倒车影像等视觉设备当中.在智能车竞赛中,通过摄像头对赛道信息的采集,在单片机上提取赛道两边的边缘,经过处理后控制小车在赛道边缘内行驶.但由于摄像头与赛道之间 ...

  8. 17届智能车图像处理部分讲解

    目录 须知 寻边线 寻拐点 补线 最后 须知 讲解代码使用的摄像头为总钻风摄像头,图像像素为188*120,图像进行了二值化,这里建议如果需要对光线有要求的同学使用灰度处理.没有使用过上位机,展示的图 ...

  9. 智能车图像处理去畸变教程

    逆透视请参考:智能车逆透视教程(含上位机.源码)_Wyean的博客-CSDN博客  去畸变+逆透视请参考:智能车去畸变+逆透视教程_LoseHu的博客-CSDN博客 去畸变:如下 1.简介 对于镜头而 ...

  10. 智能车图像处理11-斜入十字补线

    前言 这篇文章主要讲述智能车竞赛中如何对于斜入十字进行补线操作. 一.代码 思路讲解: 补十字相较于 其他元素 是比较简单的 核心就是找十字路口: 四个拐点(也许看不到四个,比如斜入时可能只能看到一个 ...

最新文章

  1. Qt for ios 在 xcode 中编译(便于调试)
  2. 合并两个已经排好序的不等长的数组
  3. Linux 下升级 python2 到python3
  4. Angular应用ng serve命令行的学习笔记
  5. 函数进阶_月隐学python第11课
  6. java arp 攻击_用JAVA代码实现ARP攻击 | 学步园
  7. 使用活动记录执行CRUD
  8. Asp.net mvc 实时生成缩率图到硬盘
  9. 用html5点击消失,input点击后placeholder中的提示消息消失
  10. linux 如何查看fb中分辨率_西门子S71200,如何在FB块中使用操作定时器?
  11. Spark重要概念提出时间戳和原因
  12. Django-(分页器,中间介)
  13. Analytic Functions in Oracle 8i and 9i
  14. Git--分布式版本控制系统
  15. EF中DataContext创建的两段代码收藏
  16. java反序列化为空_Java序列化/反序列化,提供空对象引用
  17. Linux安装微信、QQ
  18. 烤仔TVのCCW丨密码学通识(一)密码学基础及常见误区
  19. 【装机必备】电脑优化清理工具
  20. iphone X 屏幕适配

热门文章

  1. 数字滤波算法——中值滤波
  2. c语言程序设计二维数组ppt,C语言程序设计教程二维数组的应用优秀讲义.ppt
  3. 思科模拟器Cisco Packet Tracer的汉化教程
  4. Socket编程入门(一)实现简单的Socket实例
  5. ftp的上传与单文件下载
  6. 关于attachEvent与addEventListener事件绑定兼容问题
  7. 拟合函数、曲线拟合有这个网站足够了
  8. 【娜家花园养花小记】
  9. 摄影测量学和计算机视觉,摄影测量学
  10. [matlab数字图像处理10]对一副图像进行二值化,ostu算法等