Tony Lin / Mbed 2 deprecated BX-car

Dependencies:   mbed-rtos mbed

Fork of BX-car by kao yi

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers camera_api.cpp Source File

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 }