Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of BX-car by
camera_api.cpp
00001 #include "mbed.h" 00002 #include "camera_api.h" 00003 00004 #define clk 2 //ms 00005 00006 BX_camera::BX_camera(void) 00007 { 00008 00009 line_CamR = new FastAnalogIn(PTD5); 00010 line_CamL= new FastAnalogIn(PTD6,0); 00011 cam_clk=new DigitalOut(PTE1); 00012 si=new DigitalOut(PTD7); 00013 00014 } 00015 00016 int BX_camera::black_centerR(void) 00017 { 00018 00019 int l_care=10; 00020 int r_care=118; 00021 00022 00023 // find center 00024 // case 1 // | // 00025 // case 2 / | / 00026 00027 char find_type=0x00; 00028 00029 int b_end=118; 00030 int b_start=118; 00031 00032 int b_w=0; 00033 int b_center=0; 00034 00035 int b2_end=0; 00036 int b2_start=0; 00037 int b2_center=0; 00038 00039 int b2_w=0; 00040 00041 int center=30; 00042 int j=64; 00043 bool f1=false; 00044 bool f2=false; 00045 bool f3=false; 00046 bool f4=false; 00047 int w_thr_up=32; 00048 int w_thr_dn=0; 00049 00050 if(sign_line_imageR[64]==' ') 00051 find_type=0x02; 00052 else 00053 find_type=0x01; 00054 00055 00056 for(int i=64; i<r_care; i++,j--) { 00057 00058 00059 switch(find_type) { 00060 00061 00062 case 0x01: 00063 00064 if(f1==false&&sign_line_imageR[i]==' ') { 00065 if(f1==false) { 00066 b_start=i; 00067 f1=true; 00068 } 00069 00070 } 00071 if(f1== true&& f2==false&&sign_line_imageR[i]=='O') { 00072 if(f2==false) { 00073 b_end=i-1; 00074 f2=true; 00075 } 00076 00077 } 00078 00079 if(f3==false&&sign_line_imageR[j]==' ') { 00080 if(f3==false) { 00081 b2_end=j; 00082 f3=true; 00083 } 00084 00085 } 00086 if(f3==true&&f4==false&&sign_line_imageR[j]=='O') { 00087 if(f4==false) { 00088 b2_start=j-1; 00089 f4=true; 00090 } 00091 00092 } 00093 00094 00095 break; 00096 00097 00098 case 0x02: 00099 00100 if(sign_line_imageR[i]=='O') { 00101 00102 if(f1==false) { 00103 b_end=i; 00104 f1=true; 00105 } 00106 } 00107 00108 if(sign_line_imageR[j]=='O') { 00109 00110 if(f2==false) { 00111 b_start=j; 00112 f2=true; 00113 } 00114 00115 } 00116 00117 00118 break; 00119 00120 } 00121 00122 00123 } 00124 00125 b_w=b_start-b_end; 00126 b2_w=b2_start-b2_end; 00127 00128 de_v=b_start; 00129 de_v2=b_end; 00130 00131 switch(find_type) { 00132 00133 case 0x01: 00134 b_center=(b_end+b_start)/2; 00135 b2_center=(b2_end+b2_start)/2; 00136 00137 00138 if(w_thr_up>b_w&&(b_center!=0)&&(b_center-64)<(64-b2_center)) 00139 center=b_center; 00140 else 00141 center=b2_center; 00142 00143 00144 00145 00146 00147 /* if( ( w_thr_up- (b_w))>0 &&( ( w_thr_up- (b_w)) < (w_thr_up-(b2_w)) ) ) { 00148 center=(b_end+b_start)/2; 00149 00150 00151 00152 // } else if( ( w_thr_up- (b2_w) )>0 ) { 00153 center=(b2_end+b2_start)/2; 00154 // } else { 00155 00156 center=65; 00157 00158 //???????????????? 00159 00160 } 00161 00162 */ 00163 break; 00164 00165 case 0x02: 00166 center=(b_end+b_start)/2; 00167 00168 00169 break; 00170 } 00171 00172 return center; 00173 00174 } 00175 00176 00177 00178 int BX_camera::black_centerL(void) 00179 { 00180 00181 int l_care=10; 00182 int r_care=118; 00183 00184 00185 // find center 00186 // case 1 // | // 00187 // case 2 / | / 00188 00189 char find_type=0x00; 00190 00191 int b_end=118; 00192 int b_start=118; 00193 00194 int b_w=0; 00195 int b_center=0; 00196 00197 int b2_end=0; 00198 int b2_start=0; 00199 int b2_center=0; 00200 00201 int b2_w=0; 00202 00203 int center=30; 00204 int j=64; 00205 bool f1=false; 00206 bool f2=false; 00207 bool f3=false; 00208 bool f4=false; 00209 int w_thr_up=32; 00210 int w_thr_dn=0; 00211 00212 if(sign_line_imageR[64]==' ') 00213 find_type=0x02; 00214 else 00215 find_type=0x01; 00216 00217 00218 for(int i=64; i<r_care; i++,j--) { 00219 00220 00221 switch(find_type) { 00222 00223 00224 case 0x01: 00225 00226 if(f1==false&&sign_line_imageR[i]==' ') { 00227 if(f1==false) { 00228 b_start=i; 00229 f1=true; 00230 } 00231 00232 } 00233 if(f1== true&& f2==false&&sign_line_imageR[i]=='O') { 00234 if(f2==false) { 00235 b_end=i-1; 00236 f2=true; 00237 } 00238 00239 } 00240 00241 if(f3==false&&sign_line_imageR[j]==' ') { 00242 if(f3==false) { 00243 b2_end=j; 00244 f3=true; 00245 } 00246 00247 } 00248 if(f3==true&&f4==false&&sign_line_imageR[j]=='O') { 00249 if(f4==false) { 00250 b2_start=j-1; 00251 f4=true; 00252 } 00253 00254 } 00255 00256 00257 break; 00258 00259 00260 case 0x02: 00261 00262 if(sign_line_imageR[i]=='O') { 00263 00264 if(f1==false) { 00265 b_end=i; 00266 f1=true; 00267 } 00268 } 00269 00270 if(sign_line_imageR[j]=='O') { 00271 00272 if(f2==false) { 00273 b_start=j; 00274 f2=true; 00275 } 00276 00277 } 00278 00279 00280 break; 00281 00282 } 00283 00284 00285 } 00286 00287 b_w=b_start-b_end; 00288 b2_w=b2_start-b2_end; 00289 00290 de_v=b_start; 00291 de_v2=b_end; 00292 00293 switch(find_type) { 00294 00295 case 0x01: 00296 b_center=(b_end+b_start)/2; 00297 b2_center=(b2_end+b2_start)/2; 00298 00299 00300 if(w_thr_up>b_w&&(b_center!=0)&&(b_center-64)<(64-b2_center)) 00301 center=b_center; 00302 else 00303 center=b2_center; 00304 00305 00306 00307 00308 00309 /* if( ( w_thr_up- (b_w))>0 &&( ( w_thr_up- (b_w)) < (w_thr_up-(b2_w)) ) ) { 00310 center=(b_end+b_start)/2; 00311 00312 00313 00314 // } else if( ( w_thr_up- (b2_w) )>0 ) { 00315 center=(b2_end+b2_start)/2; 00316 // } else { 00317 00318 center=65; 00319 00320 //???????????????? 00321 00322 } 00323 00324 */ 00325 break; 00326 00327 case 0x02: 00328 center=(b_end+b_start)/2; 00329 00330 00331 break; 00332 } 00333 00334 return center; 00335 00336 } 00337 00338 00339 00340 00341 00342 void BX_camera::read(void) 00343 { 00344 00345 w_f_vL=0x0000; 00346 b_f_vL=0xffff; 00347 00348 w_f_vR=0x0000; 00349 b_f_vR=0xffff; 00350 00351 00352 00353 00354 *si=1; 00355 *cam_clk=1; 00356 00357 wait_us(30); // tune here 00358 *si=0; 00359 *cam_clk=0; 00360 00361 00362 00363 line_CamR->enable(); 00364 line_CamL->enable(); 00365 00366 00367 //input 128 //both 00368 00369 for(int i=0; i<128; i++) { 00370 *cam_clk=1; 00371 wait_us(5); 00372 00373 00374 line_imageR[i]=line_CamR->read_u16(); 00375 line_imageL[i]=line_CamL->read_u16(); 00376 00377 // big small 00378 if(line_imageR[i] > w_f_vR) 00379 w_f_vR=line_imageR[i]; 00380 else if(line_imageR[i] < b_f_vR ) 00381 b_f_vR = line_imageR[i]; 00382 00383 00384 if(line_imageL[i] > w_f_vL) 00385 w_f_vL=line_imageL[i]; 00386 else if(line_imageL[i] < b_f_vL ) 00387 b_f_vL = line_imageL[i]; 00388 00389 00390 00391 00392 *cam_clk=0; 00393 wait_us(5); 00394 00395 00396 } 00397 00398 00399 line_CamR->enable(); 00400 line_CamL->enable(); 00401 00402 00403 //filter L R //may change 00404 00405 for(int i=0; i<128; i++) { 00406 00407 00408 if( (line_imageR[i]-b_f_vR) < (w_f_vR - line_imageR[i] ) ) 00409 sign_line_imageR[i]=' '; 00410 else 00411 sign_line_imageR[i]='O'; 00412 00413 00414 if( (line_imageL[i]-b_f_vL) < (w_f_vL - line_imageL[i] ) ) 00415 sign_line_imageL[i]=' '; 00416 else 00417 sign_line_imageL[i]='O'; 00418 00419 00420 00421 00422 00423 if(i==0) { 00424 sign_line_imageR[i]='X'; 00425 sign_line_imageL[i]='X'; 00426 } 00427 00428 00429 } 00430 00431 00432 00433 }
Generated on Fri Jul 15 2022 11:40:17 by
 1.7.2 
    