image transformation and pattern matching (very basic)
Dependents: mycame Practica4_Camara
imagetr.cpp@0:7e50b328a66f, 2016-02-17 (annotated)
- Committer:
- sylvainkritter
- Date:
- Wed Feb 17 16:53:33 2016 +0000
- Revision:
- 0:7e50b328a66f
create imagetr library for image transformation
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sylvainkritter | 0:7e50b328a66f | 1 | #pragma once |
sylvainkritter | 0:7e50b328a66f | 2 | #include "mbed.h" |
sylvainkritter | 0:7e50b328a66f | 3 | #include "global.h" |
sylvainkritter | 0:7e50b328a66f | 4 | #include "imagetr.h" |
sylvainkritter | 0:7e50b328a66f | 5 | #include "SDFileSystem.h" |
sylvainkritter | 0:7e50b328a66f | 6 | #include "SPI_TFT_ILI9341.h" |
sylvainkritter | 0:7e50b328a66f | 7 | |
sylvainkritter | 0:7e50b328a66f | 8 | |
sylvainkritter | 0:7e50b328a66f | 9 | //DigitalOut str(PB_3); // internal strobe for debug |
sylvainkritter | 0:7e50b328a66f | 10 | //DigitalOut str1(PC_8); // internal strobe for debug |
sylvainkritter | 0:7e50b328a66f | 11 | |
sylvainkritter | 0:7e50b328a66f | 12 | void imagetr::getimage( const char nf[]) |
sylvainkritter | 0:7e50b328a66f | 13 | { |
sylvainkritter | 0:7e50b328a66f | 14 | fp = fopen(nf, "r"); |
sylvainkritter | 0:7e50b328a66f | 15 | pc.printf("get %s\r\n", nf); |
sylvainkritter | 0:7e50b328a66f | 16 | for (int i=0; i<tmarray; i++) { |
sylvainkritter | 0:7e50b328a66f | 17 | |
sylvainkritter | 0:7e50b328a66f | 18 | bank[i] =fgetc(fp); |
sylvainkritter | 0:7e50b328a66f | 19 | } |
sylvainkritter | 0:7e50b328a66f | 20 | fclose(fp); |
sylvainkritter | 0:7e50b328a66f | 21 | } |
sylvainkritter | 0:7e50b328a66f | 22 | |
sylvainkritter | 0:7e50b328a66f | 23 | void imagetr::avera() |
sylvainkritter | 0:7e50b328a66f | 24 | { |
sylvainkritter | 0:7e50b328a66f | 25 | int i,j,k,l, av; |
sylvainkritter | 0:7e50b328a66f | 26 | for (i=1; i<nl-1; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 27 | for (j=1; j<nc-1; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 28 | av=0; |
sylvainkritter | 0:7e50b328a66f | 29 | for (k=0; k<3; k++) { |
sylvainkritter | 0:7e50b328a66f | 30 | for (l=0; l<3; l++) { |
sylvainkritter | 0:7e50b328a66f | 31 | av=av+banktc[i-1+k][j-1+l]; |
sylvainkritter | 0:7e50b328a66f | 32 | } |
sylvainkritter | 0:7e50b328a66f | 33 | } |
sylvainkritter | 0:7e50b328a66f | 34 | banktc[i][j]=av/9; |
sylvainkritter | 0:7e50b328a66f | 35 | } |
sylvainkritter | 0:7e50b328a66f | 36 | } |
sylvainkritter | 0:7e50b328a66f | 37 | } |
sylvainkritter | 0:7e50b328a66f | 38 | |
sylvainkritter | 0:7e50b328a66f | 39 | |
sylvainkritter | 0:7e50b328a66f | 40 | void imagetr::extrta() |
sylvainkritter | 0:7e50b328a66f | 41 | { |
sylvainkritter | 0:7e50b328a66f | 42 | for (int i=120-nlta; i<120; i++) { |
sylvainkritter | 0:7e50b328a66f | 43 | for (int j=0; j<ncta; j++) { |
sylvainkritter | 0:7e50b328a66f | 44 | bankta[i-120+nlta][j][0]=banktc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 45 | } |
sylvainkritter | 0:7e50b328a66f | 46 | } |
sylvainkritter | 0:7e50b328a66f | 47 | } |
sylvainkritter | 0:7e50b328a66f | 48 | int imagetr::ar(float a) |
sylvainkritter | 0:7e50b328a66f | 49 | { |
sylvainkritter | 0:7e50b328a66f | 50 | int ai; |
sylvainkritter | 0:7e50b328a66f | 51 | ai=a; |
sylvainkritter | 0:7e50b328a66f | 52 | if (a-ai >=0.5f) { |
sylvainkritter | 0:7e50b328a66f | 53 | return a+1; |
sylvainkritter | 0:7e50b328a66f | 54 | } else { |
sylvainkritter | 0:7e50b328a66f | 55 | return a; |
sylvainkritter | 0:7e50b328a66f | 56 | } |
sylvainkritter | 0:7e50b328a66f | 57 | } |
sylvainkritter | 0:7e50b328a66f | 58 | |
sylvainkritter | 0:7e50b328a66f | 59 | void imagetr::affine (int x, int y, float a, float z) |
sylvainkritter | 0:7e50b328a66f | 60 | { |
sylvainkritter | 0:7e50b328a66f | 61 | float cosa, sina, tif, tjf, dx, dy ; |
sylvainkritter | 0:7e50b328a66f | 62 | int ti,tj,i,j, tm1i, tm1j, til, tih, tjl, tjh; |
sylvainkritter | 0:7e50b328a66f | 63 | cosa=cos(a); |
sylvainkritter | 0:7e50b328a66f | 64 | sina=sin(a); |
sylvainkritter | 0:7e50b328a66f | 65 | for (i=0; i<nl; i++) { |
sylvainkritter | 0:7e50b328a66f | 66 | for (j=0; j<nc; j++) { |
sylvainkritter | 0:7e50b328a66f | 67 | banktc[i][j]=25; |
sylvainkritter | 0:7e50b328a66f | 68 | } |
sylvainkritter | 0:7e50b328a66f | 69 | } |
sylvainkritter | 0:7e50b328a66f | 70 | for (i=0; i<nl; i++) { |
sylvainkritter | 0:7e50b328a66f | 71 | for (j=0; j<nc; j++) { |
sylvainkritter | 0:7e50b328a66f | 72 | |
sylvainkritter | 0:7e50b328a66f | 73 | dx=i-61; |
sylvainkritter | 0:7e50b328a66f | 74 | dy=j-80; |
sylvainkritter | 0:7e50b328a66f | 75 | tif=dx*cosa - dy*sina + 60; |
sylvainkritter | 0:7e50b328a66f | 76 | tjf=dx*sina + dy*cosa + 80; |
sylvainkritter | 0:7e50b328a66f | 77 | tif=tif-x; |
sylvainkritter | 0:7e50b328a66f | 78 | tjf=tjf-y; |
sylvainkritter | 0:7e50b328a66f | 79 | ti=ar((tif-60) * z + 60); |
sylvainkritter | 0:7e50b328a66f | 80 | tj=ar((tjf-80) * z + 80 ); |
sylvainkritter | 0:7e50b328a66f | 81 | tm1i =ti; |
sylvainkritter | 0:7e50b328a66f | 82 | if (tm1i<0) { |
sylvainkritter | 0:7e50b328a66f | 83 | tm1i=0; |
sylvainkritter | 0:7e50b328a66f | 84 | } |
sylvainkritter | 0:7e50b328a66f | 85 | if (tm1i>nl-1) { |
sylvainkritter | 0:7e50b328a66f | 86 | tm1i=nl-1; |
sylvainkritter | 0:7e50b328a66f | 87 | } |
sylvainkritter | 0:7e50b328a66f | 88 | |
sylvainkritter | 0:7e50b328a66f | 89 | dx=i-60; |
sylvainkritter | 0:7e50b328a66f | 90 | dy=j-81; |
sylvainkritter | 0:7e50b328a66f | 91 | tif=dx*cosa - dy*sina + 60; |
sylvainkritter | 0:7e50b328a66f | 92 | tjf=dx*sina + dy*cosa + 80; |
sylvainkritter | 0:7e50b328a66f | 93 | tif=tif-x; |
sylvainkritter | 0:7e50b328a66f | 94 | tjf=tjf-y; |
sylvainkritter | 0:7e50b328a66f | 95 | ti=ar((tif-60) * z + 60); |
sylvainkritter | 0:7e50b328a66f | 96 | tj=ar((tjf-80) * z + 80 ); |
sylvainkritter | 0:7e50b328a66f | 97 | tm1j =tj; |
sylvainkritter | 0:7e50b328a66f | 98 | if (tm1j<0) { |
sylvainkritter | 0:7e50b328a66f | 99 | tm1j=0; |
sylvainkritter | 0:7e50b328a66f | 100 | } |
sylvainkritter | 0:7e50b328a66f | 101 | if (tm1j>=nc) { |
sylvainkritter | 0:7e50b328a66f | 102 | tm1j=nc-1; |
sylvainkritter | 0:7e50b328a66f | 103 | } |
sylvainkritter | 0:7e50b328a66f | 104 | |
sylvainkritter | 0:7e50b328a66f | 105 | dx=i-60; |
sylvainkritter | 0:7e50b328a66f | 106 | dy=j-80; |
sylvainkritter | 0:7e50b328a66f | 107 | tif=dx*cosa - dy*sina + 60; |
sylvainkritter | 0:7e50b328a66f | 108 | tjf=dx*sina + dy*cosa + 80; |
sylvainkritter | 0:7e50b328a66f | 109 | tif=tif-x; |
sylvainkritter | 0:7e50b328a66f | 110 | tjf=tjf-y; |
sylvainkritter | 0:7e50b328a66f | 111 | ti=ar((tif-60) * z + 60); |
sylvainkritter | 0:7e50b328a66f | 112 | tj=ar((tjf-80) * z + 80 ); |
sylvainkritter | 0:7e50b328a66f | 113 | |
sylvainkritter | 0:7e50b328a66f | 114 | if((ti>=0) && (tj >=0) && (ti <nl) && (tj < nc)) { |
sylvainkritter | 0:7e50b328a66f | 115 | banktc[ti][tj]=bankt[i][j]; |
sylvainkritter | 0:7e50b328a66f | 116 | if (ti> tm1i) { |
sylvainkritter | 0:7e50b328a66f | 117 | til = tm1i; |
sylvainkritter | 0:7e50b328a66f | 118 | tih = ti; |
sylvainkritter | 0:7e50b328a66f | 119 | } else { |
sylvainkritter | 0:7e50b328a66f | 120 | til =ti; |
sylvainkritter | 0:7e50b328a66f | 121 | tih = tm1i; |
sylvainkritter | 0:7e50b328a66f | 122 | } |
sylvainkritter | 0:7e50b328a66f | 123 | |
sylvainkritter | 0:7e50b328a66f | 124 | if (tj> tm1j) { |
sylvainkritter | 0:7e50b328a66f | 125 | tjl = tm1j; |
sylvainkritter | 0:7e50b328a66f | 126 | tjh = tj; |
sylvainkritter | 0:7e50b328a66f | 127 | } else { |
sylvainkritter | 0:7e50b328a66f | 128 | tjl =tj; |
sylvainkritter | 0:7e50b328a66f | 129 | tjh = tm1j; |
sylvainkritter | 0:7e50b328a66f | 130 | } |
sylvainkritter | 0:7e50b328a66f | 131 | for (int k = til; k<tih+1; k++) { |
sylvainkritter | 0:7e50b328a66f | 132 | for (int l = tjl; l<tjh+1; l++) { |
sylvainkritter | 0:7e50b328a66f | 133 | banktc[k][l]=bankt[i][j]; |
sylvainkritter | 0:7e50b328a66f | 134 | } |
sylvainkritter | 0:7e50b328a66f | 135 | } |
sylvainkritter | 0:7e50b328a66f | 136 | } |
sylvainkritter | 0:7e50b328a66f | 137 | } |
sylvainkritter | 0:7e50b328a66f | 138 | |
sylvainkritter | 0:7e50b328a66f | 139 | } |
sylvainkritter | 0:7e50b328a66f | 140 | } |
sylvainkritter | 0:7e50b328a66f | 141 | void imagetr::genta (float tx, float ty, float a, float z) |
sylvainkritter | 0:7e50b328a66f | 142 | { |
sylvainkritter | 0:7e50b328a66f | 143 | // generate multiple ta |
sylvainkritter | 0:7e50b328a66f | 144 | float cosa, sina, tif, tjf, dx, dy ; |
sylvainkritter | 0:7e50b328a66f | 145 | int ti,tj,i,j, tm1i, tm1j, til, tih, tjl, tjh; |
sylvainkritter | 0:7e50b328a66f | 146 | cosa=cos(a); |
sylvainkritter | 0:7e50b328a66f | 147 | sina=sin(a); |
sylvainkritter | 0:7e50b328a66f | 148 | int nlta2=nlta/2; |
sylvainkritter | 0:7e50b328a66f | 149 | int ncta2=ncta/2; |
sylvainkritter | 0:7e50b328a66f | 150 | for (i=0; i<nlta; i++) { |
sylvainkritter | 0:7e50b328a66f | 151 | for (j=0; j<ncta; j++) { |
sylvainkritter | 0:7e50b328a66f | 152 | banktatc[i][j]=25; |
sylvainkritter | 0:7e50b328a66f | 153 | } |
sylvainkritter | 0:7e50b328a66f | 154 | } |
sylvainkritter | 0:7e50b328a66f | 155 | for (i=0; i<nlta; i++) { |
sylvainkritter | 0:7e50b328a66f | 156 | for (j=0; j<ncta; j++) { |
sylvainkritter | 0:7e50b328a66f | 157 | |
sylvainkritter | 0:7e50b328a66f | 158 | dx=(i-nlta2-1)*tx; |
sylvainkritter | 0:7e50b328a66f | 159 | dy=(j-ncta2)*ty; |
sylvainkritter | 0:7e50b328a66f | 160 | tif=dx*cosa - dy*sina + nlta2; |
sylvainkritter | 0:7e50b328a66f | 161 | tjf=dx*sina + dy*cosa + ncta2; |
sylvainkritter | 0:7e50b328a66f | 162 | ti=ar((tif-nlta2) * z + nlta2); |
sylvainkritter | 0:7e50b328a66f | 163 | tj=ar((tjf-ncta2) * z + ncta2 ); |
sylvainkritter | 0:7e50b328a66f | 164 | tm1i =ti; |
sylvainkritter | 0:7e50b328a66f | 165 | if (tm1i<0) { |
sylvainkritter | 0:7e50b328a66f | 166 | tm1i=0; |
sylvainkritter | 0:7e50b328a66f | 167 | } |
sylvainkritter | 0:7e50b328a66f | 168 | if (tm1i>nlta-1) { |
sylvainkritter | 0:7e50b328a66f | 169 | tm1i=nlta-1; |
sylvainkritter | 0:7e50b328a66f | 170 | } |
sylvainkritter | 0:7e50b328a66f | 171 | dx=(i-nlta2)*tx; |
sylvainkritter | 0:7e50b328a66f | 172 | dy=(j-ncta2-1)*ty; |
sylvainkritter | 0:7e50b328a66f | 173 | tif=dx*cosa - dy*sina + nlta2; |
sylvainkritter | 0:7e50b328a66f | 174 | tjf=dx*sina + dy*cosa + ncta2; |
sylvainkritter | 0:7e50b328a66f | 175 | ti=ar((tif-nlta2) * z + nlta2); |
sylvainkritter | 0:7e50b328a66f | 176 | tj=ar((tjf-ncta2) * z + ncta2 ); |
sylvainkritter | 0:7e50b328a66f | 177 | tm1j =tj; |
sylvainkritter | 0:7e50b328a66f | 178 | if (tm1j<0) { |
sylvainkritter | 0:7e50b328a66f | 179 | tm1j=0; |
sylvainkritter | 0:7e50b328a66f | 180 | } |
sylvainkritter | 0:7e50b328a66f | 181 | if (tm1j>=ncta) { |
sylvainkritter | 0:7e50b328a66f | 182 | tm1j=ncta-1; |
sylvainkritter | 0:7e50b328a66f | 183 | } |
sylvainkritter | 0:7e50b328a66f | 184 | |
sylvainkritter | 0:7e50b328a66f | 185 | dx=(i-nlta2)*tx; |
sylvainkritter | 0:7e50b328a66f | 186 | dy=(j-ncta2)*ty; |
sylvainkritter | 0:7e50b328a66f | 187 | tif=dx*cosa - dy*sina + nlta2; |
sylvainkritter | 0:7e50b328a66f | 188 | tjf=dx*sina + dy*cosa + ncta2; |
sylvainkritter | 0:7e50b328a66f | 189 | ti=ar((tif-nlta2) * z + nlta2); |
sylvainkritter | 0:7e50b328a66f | 190 | tj=ar((tjf-ncta2) * z + ncta2 ); |
sylvainkritter | 0:7e50b328a66f | 191 | |
sylvainkritter | 0:7e50b328a66f | 192 | if((ti>=0) && (tj >=0) && (ti <nlta) && (tj < ncta)) { |
sylvainkritter | 0:7e50b328a66f | 193 | banktatc[ti][tj]=bankta[i][j][0]; |
sylvainkritter | 0:7e50b328a66f | 194 | if (ti> tm1i) { |
sylvainkritter | 0:7e50b328a66f | 195 | til = tm1i; |
sylvainkritter | 0:7e50b328a66f | 196 | tih = ti; |
sylvainkritter | 0:7e50b328a66f | 197 | } else { |
sylvainkritter | 0:7e50b328a66f | 198 | til =ti; |
sylvainkritter | 0:7e50b328a66f | 199 | tih = tm1i; |
sylvainkritter | 0:7e50b328a66f | 200 | } |
sylvainkritter | 0:7e50b328a66f | 201 | |
sylvainkritter | 0:7e50b328a66f | 202 | if (tj> tm1j) { |
sylvainkritter | 0:7e50b328a66f | 203 | tjl = tm1j; |
sylvainkritter | 0:7e50b328a66f | 204 | tjh = tj; |
sylvainkritter | 0:7e50b328a66f | 205 | } else { |
sylvainkritter | 0:7e50b328a66f | 206 | tjl =tj; |
sylvainkritter | 0:7e50b328a66f | 207 | tjh = tm1j; |
sylvainkritter | 0:7e50b328a66f | 208 | } |
sylvainkritter | 0:7e50b328a66f | 209 | for (int k = til; k<tih+1; k++) { |
sylvainkritter | 0:7e50b328a66f | 210 | for (int l = tjl; l<tjh+1; l++) { |
sylvainkritter | 0:7e50b328a66f | 211 | banktatc[k][l]=bankta[i][j][0]; |
sylvainkritter | 0:7e50b328a66f | 212 | } |
sylvainkritter | 0:7e50b328a66f | 213 | } |
sylvainkritter | 0:7e50b328a66f | 214 | } |
sylvainkritter | 0:7e50b328a66f | 215 | } |
sylvainkritter | 0:7e50b328a66f | 216 | |
sylvainkritter | 0:7e50b328a66f | 217 | } |
sylvainkritter | 0:7e50b328a66f | 218 | |
sylvainkritter | 0:7e50b328a66f | 219 | } |
sylvainkritter | 0:7e50b328a66f | 220 | void imagetr::lumi (float z) |
sylvainkritter | 0:7e50b328a66f | 221 | { |
sylvainkritter | 0:7e50b328a66f | 222 | int i,j; |
sylvainkritter | 0:7e50b328a66f | 223 | for (i=0; i<nl; i++) { |
sylvainkritter | 0:7e50b328a66f | 224 | for (j=0; j<nc; j++) { |
sylvainkritter | 0:7e50b328a66f | 225 | banktc[i][j]=banktc[i][j]*z; |
sylvainkritter | 0:7e50b328a66f | 226 | } |
sylvainkritter | 0:7e50b328a66f | 227 | } |
sylvainkritter | 0:7e50b328a66f | 228 | } |
sylvainkritter | 0:7e50b328a66f | 229 | |
sylvainkritter | 0:7e50b328a66f | 230 | void imagetr::rgbtoy(void) |
sylvainkritter | 0:7e50b328a66f | 231 | { |
sylvainkritter | 0:7e50b328a66f | 232 | //transform bank in Y in table bankt |
sylvainkritter | 0:7e50b328a66f | 233 | int R,G,G1,B,Y; |
sylvainkritter | 0:7e50b328a66f | 234 | for (int i=0; i<tmarray; i=i+2) { |
sylvainkritter | 0:7e50b328a66f | 235 | |
sylvainkritter | 0:7e50b328a66f | 236 | R=(bank[i+1]>>3); |
sylvainkritter | 0:7e50b328a66f | 237 | G=(bank[i+1]&0x07)<<3; |
sylvainkritter | 0:7e50b328a66f | 238 | |
sylvainkritter | 0:7e50b328a66f | 239 | G1=bank[i]>>5; |
sylvainkritter | 0:7e50b328a66f | 240 | G= G|G1; |
sylvainkritter | 0:7e50b328a66f | 241 | B=bank[i]&0x1f; |
sylvainkritter | 0:7e50b328a66f | 242 | |
sylvainkritter | 0:7e50b328a66f | 243 | Y=ar(0.299f*R+0.587f*G+0.114f*B); |
sylvainkritter | 0:7e50b328a66f | 244 | //pc.printf("i:%d\r\n",i); |
sylvainkritter | 0:7e50b328a66f | 245 | bankt[i/nc2][(i/2)%nc]=Y; |
sylvainkritter | 0:7e50b328a66f | 246 | } |
sylvainkritter | 0:7e50b328a66f | 247 | } |
sylvainkritter | 0:7e50b328a66f | 248 | void imagetr::rgbtoyta(void) |
sylvainkritter | 0:7e50b328a66f | 249 | { |
sylvainkritter | 0:7e50b328a66f | 250 | //transform bank in Y in table bankta, create muliple view |
sylvainkritter | 0:7e50b328a66f | 251 | int R,G,G1,B,Y; |
sylvainkritter | 0:7e50b328a66f | 252 | for (int i=0; i<tmarrayta; i=i+2) { |
sylvainkritter | 0:7e50b328a66f | 253 | R=(bank[i+1]>>3); |
sylvainkritter | 0:7e50b328a66f | 254 | G=(bank[i+1]&0x07)<<3; |
sylvainkritter | 0:7e50b328a66f | 255 | |
sylvainkritter | 0:7e50b328a66f | 256 | G1=bank[i]>>5; |
sylvainkritter | 0:7e50b328a66f | 257 | G= G|G1; |
sylvainkritter | 0:7e50b328a66f | 258 | B=bank[i]&0x1f; |
sylvainkritter | 0:7e50b328a66f | 259 | |
sylvainkritter | 0:7e50b328a66f | 260 | Y=ar(0.299f*R+0.587f*G+0.114f*B); |
sylvainkritter | 0:7e50b328a66f | 261 | bankta[i/nc2ta][(i/2)%ncta][0]=Y; |
sylvainkritter | 0:7e50b328a66f | 262 | } |
sylvainkritter | 0:7e50b328a66f | 263 | |
sylvainkritter | 0:7e50b328a66f | 264 | |
sylvainkritter | 0:7e50b328a66f | 265 | genta (1, 1, 0.17, 1); // 10 deg |
sylvainkritter | 0:7e50b328a66f | 266 | for (int i=0; i<nlta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 267 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 268 | bankta[i][j][1]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 269 | } |
sylvainkritter | 0:7e50b328a66f | 270 | } |
sylvainkritter | 0:7e50b328a66f | 271 | genta (1, 1, -0.17, 1); // -10 deg |
sylvainkritter | 0:7e50b328a66f | 272 | for (int i=0; i<nlta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 273 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 274 | bankta[i][j][2]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 275 | } |
sylvainkritter | 0:7e50b328a66f | 276 | } |
sylvainkritter | 0:7e50b328a66f | 277 | genta (1, 1, 0, 0.8); // zoom 0.8 |
sylvainkritter | 0:7e50b328a66f | 278 | for (int i=0; i<nlta; i++) { |
sylvainkritter | 0:7e50b328a66f | 279 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 280 | bankta[i][j][3]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 281 | } |
sylvainkritter | 0:7e50b328a66f | 282 | } |
sylvainkritter | 0:7e50b328a66f | 283 | genta (1, 1, 0, 1.20); // zoom 1.2 |
sylvainkritter | 0:7e50b328a66f | 284 | for (int i=0; i<nlta; i++) { |
sylvainkritter | 0:7e50b328a66f | 285 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 286 | bankta[i][j][4]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 287 | } |
sylvainkritter | 0:7e50b328a66f | 288 | }/* |
sylvainkritter | 0:7e50b328a66f | 289 | genta (0.9, 1, 0, 1); |
sylvainkritter | 0:7e50b328a66f | 290 | for (int i=0; i<nlta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 291 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 292 | // pc.printf("i %d, j %d b %02x\r\n", i, j, bankta[i][j][0]); |
sylvainkritter | 0:7e50b328a66f | 293 | bankta[i][j][5]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 294 | } |
sylvainkritter | 0:7e50b328a66f | 295 | } |
sylvainkritter | 0:7e50b328a66f | 296 | //pc.printf("ty\r\n"); |
sylvainkritter | 0:7e50b328a66f | 297 | genta (1, 0.9, 0, 1); |
sylvainkritter | 0:7e50b328a66f | 298 | for (int i=0; i<nlta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 299 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 300 | bankta[i][j][6]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 301 | } |
sylvainkritter | 0:7e50b328a66f | 302 | }*/ |
sylvainkritter | 0:7e50b328a66f | 303 | } |
sylvainkritter | 0:7e50b328a66f | 304 | |
sylvainkritter | 0:7e50b328a66f | 305 | |
sylvainkritter | 0:7e50b328a66f | 306 | void imagetr::rgbtoytaed(void) |
sylvainkritter | 0:7e50b328a66f | 307 | { |
sylvainkritter | 0:7e50b328a66f | 308 | //transform bank in Y in table bankta, create muliple view |
sylvainkritter | 0:7e50b328a66f | 309 | int R,G,G1,B,Y; |
sylvainkritter | 0:7e50b328a66f | 310 | for (int i=0; i<tmarrayta; i=i+2) { |
sylvainkritter | 0:7e50b328a66f | 311 | R=(bank[i+1]>>3); |
sylvainkritter | 0:7e50b328a66f | 312 | G=(bank[i+1]&0x07)<<3; |
sylvainkritter | 0:7e50b328a66f | 313 | |
sylvainkritter | 0:7e50b328a66f | 314 | G1=bank[i]>>5; |
sylvainkritter | 0:7e50b328a66f | 315 | G= G|G1; |
sylvainkritter | 0:7e50b328a66f | 316 | B=bank[i]&0x1f; |
sylvainkritter | 0:7e50b328a66f | 317 | |
sylvainkritter | 0:7e50b328a66f | 318 | Y=ar(0.299f*R+0.587f*G+0.114f*B); |
sylvainkritter | 0:7e50b328a66f | 319 | bankta[i/nc2ta][(i/2)%ncta][0]=Y; |
sylvainkritter | 0:7e50b328a66f | 320 | } |
sylvainkritter | 0:7e50b328a66f | 321 | |
sylvainkritter | 0:7e50b328a66f | 322 | extedgeta(0,0,2); |
sylvainkritter | 0:7e50b328a66f | 323 | |
sylvainkritter | 0:7e50b328a66f | 324 | for (int i=0; i<nlta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 325 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 326 | bankta[i][j][0]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 327 | } |
sylvainkritter | 0:7e50b328a66f | 328 | } |
sylvainkritter | 0:7e50b328a66f | 329 | |
sylvainkritter | 0:7e50b328a66f | 330 | genta (1, 1, 0.17, 1); // 10 deg |
sylvainkritter | 0:7e50b328a66f | 331 | for (int i=0; i<nlta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 332 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 333 | bankta[i][j][1]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 334 | } |
sylvainkritter | 0:7e50b328a66f | 335 | } |
sylvainkritter | 0:7e50b328a66f | 336 | genta (1, 1, -0.17, 1); // -10 deg |
sylvainkritter | 0:7e50b328a66f | 337 | for (int i=0; i<nlta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 338 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 339 | bankta[i][j][2]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 340 | } |
sylvainkritter | 0:7e50b328a66f | 341 | } |
sylvainkritter | 0:7e50b328a66f | 342 | genta (1, 1, 0, 0.8); // zoom 0.8 |
sylvainkritter | 0:7e50b328a66f | 343 | for (int i=0; i<nlta; i++) { |
sylvainkritter | 0:7e50b328a66f | 344 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 345 | bankta[i][j][3]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 346 | } |
sylvainkritter | 0:7e50b328a66f | 347 | } |
sylvainkritter | 0:7e50b328a66f | 348 | genta (1, 1, 0, 1.20); // zoom 1.2 |
sylvainkritter | 0:7e50b328a66f | 349 | for (int i=0; i<nlta; i++) { |
sylvainkritter | 0:7e50b328a66f | 350 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 351 | bankta[i][j][4]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 352 | } |
sylvainkritter | 0:7e50b328a66f | 353 | }/* |
sylvainkritter | 0:7e50b328a66f | 354 | genta (0.9, 1, 0, 1); |
sylvainkritter | 0:7e50b328a66f | 355 | for (int i=0; i<nlta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 356 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 357 | // pc.printf("i %d, j %d b %02x\r\n", i, j, bankta[i][j][0]); |
sylvainkritter | 0:7e50b328a66f | 358 | bankta[i][j][5]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 359 | } |
sylvainkritter | 0:7e50b328a66f | 360 | } |
sylvainkritter | 0:7e50b328a66f | 361 | //pc.printf("ty\r\n"); |
sylvainkritter | 0:7e50b328a66f | 362 | genta (1, 0.9, 0, 1); |
sylvainkritter | 0:7e50b328a66f | 363 | for (int i=0; i<nlta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 364 | for (int j=0; j<ncta; j=j+1) { |
sylvainkritter | 0:7e50b328a66f | 365 | bankta[i][j][6]= banktatc[i][j]; |
sylvainkritter | 0:7e50b328a66f | 366 | } |
sylvainkritter | 0:7e50b328a66f | 367 | }*/ |
sylvainkritter | 0:7e50b328a66f | 368 | } |
sylvainkritter | 0:7e50b328a66f | 369 | |
sylvainkritter | 0:7e50b328a66f | 370 | |
sylvainkritter | 0:7e50b328a66f | 371 | |
sylvainkritter | 0:7e50b328a66f | 372 | |
sylvainkritter | 0:7e50b328a66f | 373 | void imagetr::ytorgb(unsigned char b[nl][nc]) |
sylvainkritter | 0:7e50b328a66f | 374 | { |
sylvainkritter | 0:7e50b328a66f | 375 | //populate bank with table b |
sylvainkritter | 0:7e50b328a66f | 376 | int R,G,G1,B,Y; |
sylvainkritter | 0:7e50b328a66f | 377 | for (int i=0; i<tarray; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 378 | |
sylvainkritter | 0:7e50b328a66f | 379 | Y=b[i/nc][i%nc]; |
sylvainkritter | 0:7e50b328a66f | 380 | // Y=Y*yco; |
sylvainkritter | 0:7e50b328a66f | 381 | R=Y*0.71; |
sylvainkritter | 0:7e50b328a66f | 382 | if (R>31) { |
sylvainkritter | 0:7e50b328a66f | 383 | R=31; |
sylvainkritter | 0:7e50b328a66f | 384 | } |
sylvainkritter | 0:7e50b328a66f | 385 | G=Y*1.45; |
sylvainkritter | 0:7e50b328a66f | 386 | if (G>63) { |
sylvainkritter | 0:7e50b328a66f | 387 | G=63; |
sylvainkritter | 0:7e50b328a66f | 388 | } |
sylvainkritter | 0:7e50b328a66f | 389 | B=R; |
sylvainkritter | 0:7e50b328a66f | 390 | G1=G>>3; |
sylvainkritter | 0:7e50b328a66f | 391 | bank[2*i+1]=R<<3|G1; |
sylvainkritter | 0:7e50b328a66f | 392 | bank[2*i]=G<<5|B; |
sylvainkritter | 0:7e50b328a66f | 393 | } |
sylvainkritter | 0:7e50b328a66f | 394 | } |
sylvainkritter | 0:7e50b328a66f | 395 | |
sylvainkritter | 0:7e50b328a66f | 396 | void imagetr::ytorgbta(unsigned char b[nlta][ncta][nv], int nu,const char des[]) |
sylvainkritter | 0:7e50b328a66f | 397 | { |
sylvainkritter | 0:7e50b328a66f | 398 | //p0pulate bankf with table b special target, write targetf.txt |
sylvainkritter | 0:7e50b328a66f | 399 | int R,G,G1,B,Y; |
sylvainkritter | 0:7e50b328a66f | 400 | fp = fopen(des, "w"); |
sylvainkritter | 0:7e50b328a66f | 401 | for (int j=0; j<tmarray; j++) { |
sylvainkritter | 0:7e50b328a66f | 402 | bank[j]=25; |
sylvainkritter | 0:7e50b328a66f | 403 | } |
sylvainkritter | 0:7e50b328a66f | 404 | for (int i=0; i<tarrayta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 405 | |
sylvainkritter | 0:7e50b328a66f | 406 | Y=b[i/ncta][i%ncta][nu]; |
sylvainkritter | 0:7e50b328a66f | 407 | // Y=Y*yco; |
sylvainkritter | 0:7e50b328a66f | 408 | R=Y*0.71; |
sylvainkritter | 0:7e50b328a66f | 409 | if (R>31) { |
sylvainkritter | 0:7e50b328a66f | 410 | R=31; |
sylvainkritter | 0:7e50b328a66f | 411 | } |
sylvainkritter | 0:7e50b328a66f | 412 | G=Y*1.45; |
sylvainkritter | 0:7e50b328a66f | 413 | if (G>63) { |
sylvainkritter | 0:7e50b328a66f | 414 | G=63; |
sylvainkritter | 0:7e50b328a66f | 415 | } |
sylvainkritter | 0:7e50b328a66f | 416 | B=R; |
sylvainkritter | 0:7e50b328a66f | 417 | G1=G>>3; |
sylvainkritter | 0:7e50b328a66f | 418 | bank[2*i+1]=R<<3|G1; |
sylvainkritter | 0:7e50b328a66f | 419 | bank[2*i]=G<<5|B; |
sylvainkritter | 0:7e50b328a66f | 420 | fputc(bank[2*i], fp); |
sylvainkritter | 0:7e50b328a66f | 421 | fputc(bank[2*i+1], fp); |
sylvainkritter | 0:7e50b328a66f | 422 | |
sylvainkritter | 0:7e50b328a66f | 423 | } |
sylvainkritter | 0:7e50b328a66f | 424 | fclose(fp); |
sylvainkritter | 0:7e50b328a66f | 425 | } |
sylvainkritter | 0:7e50b328a66f | 426 | void imagetr::ytorgbtas(unsigned char b[nlta][ncta][nv], int nu) |
sylvainkritter | 0:7e50b328a66f | 427 | { |
sylvainkritter | 0:7e50b328a66f | 428 | //p0pulate bank with table b special target, without write targetfile |
sylvainkritter | 0:7e50b328a66f | 429 | int R,G,G1,B,Y; |
sylvainkritter | 0:7e50b328a66f | 430 | |
sylvainkritter | 0:7e50b328a66f | 431 | for (int j=0; j<tmarray; j++) { |
sylvainkritter | 0:7e50b328a66f | 432 | bank[j]=25; |
sylvainkritter | 0:7e50b328a66f | 433 | } |
sylvainkritter | 0:7e50b328a66f | 434 | for (int i=0; i<tarrayta; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 435 | |
sylvainkritter | 0:7e50b328a66f | 436 | Y=b[i/ncta][i%ncta][nu]; |
sylvainkritter | 0:7e50b328a66f | 437 | // Y=Y*yco; |
sylvainkritter | 0:7e50b328a66f | 438 | R=Y*0.71; |
sylvainkritter | 0:7e50b328a66f | 439 | if (R>31) { |
sylvainkritter | 0:7e50b328a66f | 440 | R=31; |
sylvainkritter | 0:7e50b328a66f | 441 | } |
sylvainkritter | 0:7e50b328a66f | 442 | G=Y*1.45; |
sylvainkritter | 0:7e50b328a66f | 443 | if (G>63) { |
sylvainkritter | 0:7e50b328a66f | 444 | G=63; |
sylvainkritter | 0:7e50b328a66f | 445 | } |
sylvainkritter | 0:7e50b328a66f | 446 | B=R; |
sylvainkritter | 0:7e50b328a66f | 447 | G1=G>>3; |
sylvainkritter | 0:7e50b328a66f | 448 | bank[2*i+1]=R<<3|G1; |
sylvainkritter | 0:7e50b328a66f | 449 | bank[2*i]=G<<5|B; |
sylvainkritter | 0:7e50b328a66f | 450 | } |
sylvainkritter | 0:7e50b328a66f | 451 | } |
sylvainkritter | 0:7e50b328a66f | 452 | |
sylvainkritter | 0:7e50b328a66f | 453 | void imagetr::extcont(int minc, int maxc) |
sylvainkritter | 0:7e50b328a66f | 454 | { |
sylvainkritter | 0:7e50b328a66f | 455 | // contrast expand |
sylvainkritter | 0:7e50b328a66f | 456 | int Y; |
sylvainkritter | 0:7e50b328a66f | 457 | for (int i=0; i<tarray; i=i+1) { |
sylvainkritter | 0:7e50b328a66f | 458 | |
sylvainkritter | 0:7e50b328a66f | 459 | Y=bankt[i/nc][i%nc]; |
sylvainkritter | 0:7e50b328a66f | 460 | if (Y<=minc) { |
sylvainkritter | 0:7e50b328a66f | 461 | Y=0; |
sylvainkritter | 0:7e50b328a66f | 462 | } |
sylvainkritter | 0:7e50b328a66f | 463 | if (Y>=maxc) { |
sylvainkritter | 0:7e50b328a66f | 464 | Y=50; |
sylvainkritter | 0:7e50b328a66f | 465 | } |
sylvainkritter | 0:7e50b328a66f | 466 | banktc[i/nc][i%nc]=Y; |
sylvainkritter | 0:7e50b328a66f | 467 | } |
sylvainkritter | 0:7e50b328a66f | 468 | } |
sylvainkritter | 0:7e50b328a66f | 469 | void imagetr::extedge(int minc, int maxc, int th) |
sylvainkritter | 0:7e50b328a66f | 470 | { |
sylvainkritter | 0:7e50b328a66f | 471 | //edge extract |
sylvainkritter | 0:7e50b328a66f | 472 | int Y,YG,YH,i,j; |
sylvainkritter | 0:7e50b328a66f | 473 | int M=0; |
sylvainkritter | 0:7e50b328a66f | 474 | for (i=0; i<nl; i++) { |
sylvainkritter | 0:7e50b328a66f | 475 | for (j=0; j<nc; j++) { |
sylvainkritter | 0:7e50b328a66f | 476 | M=M+bankt[i][j]; |
sylvainkritter | 0:7e50b328a66f | 477 | |
sylvainkritter | 0:7e50b328a66f | 478 | } |
sylvainkritter | 0:7e50b328a66f | 479 | } |
sylvainkritter | 0:7e50b328a66f | 480 | M=M/tarray; |
sylvainkritter | 0:7e50b328a66f | 481 | // if (M>maxc ||M<minc) { |
sylvainkritter | 0:7e50b328a66f | 482 | // th=1; |
sylvainkritter | 0:7e50b328a66f | 483 | // } else { |
sylvainkritter | 0:7e50b328a66f | 484 | // th=4; |
sylvainkritter | 0:7e50b328a66f | 485 | // } |
sylvainkritter | 0:7e50b328a66f | 486 | // th=6*M/minc; |
sylvainkritter | 0:7e50b328a66f | 487 | // pc.printf( "M: %d th %d: minc: %d maxc; %d \r\n",M,th, minc, maxc); |
sylvainkritter | 0:7e50b328a66f | 488 | for (i=1; i<nl; i++) { |
sylvainkritter | 0:7e50b328a66f | 489 | for (j=1; j<nc; j++) { |
sylvainkritter | 0:7e50b328a66f | 490 | Y=bankt[i][j]; |
sylvainkritter | 0:7e50b328a66f | 491 | YG=bankt[i][j-1]; |
sylvainkritter | 0:7e50b328a66f | 492 | YH=bankt[i-1][j]; |
sylvainkritter | 0:7e50b328a66f | 493 | if (abs(Y-YG) >th||abs(Y-YH) >th) { |
sylvainkritter | 0:7e50b328a66f | 494 | Y=50; |
sylvainkritter | 0:7e50b328a66f | 495 | } else { |
sylvainkritter | 0:7e50b328a66f | 496 | Y=0; |
sylvainkritter | 0:7e50b328a66f | 497 | } |
sylvainkritter | 0:7e50b328a66f | 498 | banktc[i][j]=Y; |
sylvainkritter | 0:7e50b328a66f | 499 | } |
sylvainkritter | 0:7e50b328a66f | 500 | } |
sylvainkritter | 0:7e50b328a66f | 501 | } |
sylvainkritter | 0:7e50b328a66f | 502 | void imagetr::extedgeta(int minc, int maxc, int th) |
sylvainkritter | 0:7e50b328a66f | 503 | { |
sylvainkritter | 0:7e50b328a66f | 504 | //edge extract |
sylvainkritter | 0:7e50b328a66f | 505 | int Y,YG,YH,i,j; |
sylvainkritter | 0:7e50b328a66f | 506 | int M=0; |
sylvainkritter | 0:7e50b328a66f | 507 | for (i=0; i<nlta; i++) { |
sylvainkritter | 0:7e50b328a66f | 508 | for (j=0; j<ncta; j++) { |
sylvainkritter | 0:7e50b328a66f | 509 | M=M+bankta[i][j][0]; |
sylvainkritter | 0:7e50b328a66f | 510 | |
sylvainkritter | 0:7e50b328a66f | 511 | } |
sylvainkritter | 0:7e50b328a66f | 512 | } |
sylvainkritter | 0:7e50b328a66f | 513 | M=M/tarray; |
sylvainkritter | 0:7e50b328a66f | 514 | // if (M>maxc ||M<minc) { |
sylvainkritter | 0:7e50b328a66f | 515 | // th=1; |
sylvainkritter | 0:7e50b328a66f | 516 | // } else { |
sylvainkritter | 0:7e50b328a66f | 517 | // th=4; |
sylvainkritter | 0:7e50b328a66f | 518 | // } |
sylvainkritter | 0:7e50b328a66f | 519 | // th=6*M/minc; |
sylvainkritter | 0:7e50b328a66f | 520 | // pc.printf( "M: %d th %d: minc: %d maxc; %d \r\n",M,th, minc, maxc); |
sylvainkritter | 0:7e50b328a66f | 521 | for (i=1; i<nlta; i++) { |
sylvainkritter | 0:7e50b328a66f | 522 | for (j=1; j<ncta; j++) { |
sylvainkritter | 0:7e50b328a66f | 523 | Y=bankta[i][j][0]; |
sylvainkritter | 0:7e50b328a66f | 524 | YG=bankta[i][j-1][0]; |
sylvainkritter | 0:7e50b328a66f | 525 | YH=bankta[i-1][j][0]; |
sylvainkritter | 0:7e50b328a66f | 526 | if (abs(Y-YG) >th||abs(Y-YH) >th) { |
sylvainkritter | 0:7e50b328a66f | 527 | Y=50; |
sylvainkritter | 0:7e50b328a66f | 528 | } else { |
sylvainkritter | 0:7e50b328a66f | 529 | Y=0; |
sylvainkritter | 0:7e50b328a66f | 530 | } |
sylvainkritter | 0:7e50b328a66f | 531 | banktatc[i][j]=Y; |
sylvainkritter | 0:7e50b328a66f | 532 | } |
sylvainkritter | 0:7e50b328a66f | 533 | } |
sylvainkritter | 0:7e50b328a66f | 534 | } |
sylvainkritter | 0:7e50b328a66f | 535 | |
sylvainkritter | 0:7e50b328a66f | 536 | |
sylvainkritter | 0:7e50b328a66f | 537 | void imagetr::searchpat(int th, char name[]) |
sylvainkritter | 0:7e50b328a66f | 538 | { |
sylvainkritter | 0:7e50b328a66f | 539 | int i,j,k, l, maxi, maxj, car, tt,n; |
sylvainkritter | 0:7e50b328a66f | 540 | Time.start(); |
sylvainkritter | 0:7e50b328a66f | 541 | for (n=0; n<=nv; n++) { |
sylvainkritter | 0:7e50b328a66f | 542 | for (i =0 ; i < nl-nlta; i++) { |
sylvainkritter | 0:7e50b328a66f | 543 | for (j=0; j<nc-ncta; j++) { |
sylvainkritter | 0:7e50b328a66f | 544 | tt=0; |
sylvainkritter | 0:7e50b328a66f | 545 | for (k=0; k<nlta; k++) { |
sylvainkritter | 0:7e50b328a66f | 546 | for (l=0; l<ncta; l++) { |
sylvainkritter | 0:7e50b328a66f | 547 | car= bankta[k][l][n]-banktc[i+k][j+l]; |
sylvainkritter | 0:7e50b328a66f | 548 | tt=tt+(car*car); |
sylvainkritter | 0:7e50b328a66f | 549 | if (tt>th) { |
sylvainkritter | 0:7e50b328a66f | 550 | break; |
sylvainkritter | 0:7e50b328a66f | 551 | } |
sylvainkritter | 0:7e50b328a66f | 552 | } |
sylvainkritter | 0:7e50b328a66f | 553 | } |
sylvainkritter | 0:7e50b328a66f | 554 | if (tt<th) { |
sylvainkritter | 0:7e50b328a66f | 555 | maxi=i; |
sylvainkritter | 0:7e50b328a66f | 556 | maxj=j; |
sylvainkritter | 0:7e50b328a66f | 557 | i=nl; |
sylvainkritter | 0:7e50b328a66f | 558 | j=nc; |
sylvainkritter | 0:7e50b328a66f | 559 | n=nv; |
sylvainkritter | 0:7e50b328a66f | 560 | } |
sylvainkritter | 0:7e50b328a66f | 561 | } |
sylvainkritter | 0:7e50b328a66f | 562 | } |
sylvainkritter | 0:7e50b328a66f | 563 | } |
sylvainkritter | 0:7e50b328a66f | 564 | Time.stop(); |
sylvainkritter | 0:7e50b328a66f | 565 | if (tt<th) { |
sylvainkritter | 0:7e50b328a66f | 566 | //pc.printf("line: %d, column: %d, n: %d max: %d time: %f \r\n",maxi,maxj,n0,tt, Time.read()); |
sylvainkritter | 0:7e50b328a66f | 567 | TFT.locate(160,20); |
sylvainkritter | 0:7e50b328a66f | 568 | printf("Pat found %4.2f s",Time.read()); |
sylvainkritter | 0:7e50b328a66f | 569 | TFT.locate(160+maxj+(ncta/2),240-maxi-(nlta/2)); |
sylvainkritter | 0:7e50b328a66f | 570 | printf(name); |
sylvainkritter | 0:7e50b328a66f | 571 | TFT.rect(160+maxj,240-maxi-nlta,160+maxj+ncta,240-maxi,Red); |
sylvainkritter | 0:7e50b328a66f | 572 | } else { |
sylvainkritter | 0:7e50b328a66f | 573 | TFT.locate(160,20); |
sylvainkritter | 0:7e50b328a66f | 574 | printf("Not found %4.2f s",Time.read()); |
sylvainkritter | 0:7e50b328a66f | 575 | //pc.printf("not found time: %4f n:%d max: %d \r\n",Time.read(), n0,tt); |
sylvainkritter | 0:7e50b328a66f | 576 | } |
sylvainkritter | 0:7e50b328a66f | 577 | Time.reset(); |
sylvainkritter | 0:7e50b328a66f | 578 | } |
sylvainkritter | 0:7e50b328a66f | 579 | |
sylvainkritter | 0:7e50b328a66f | 580 | int imagetr::BMP_tofile(unsigned int x, unsigned int y, const char *Name_BMP) |
sylvainkritter | 0:7e50b328a66f | 581 | { |
sylvainkritter | 0:7e50b328a66f | 582 | |
sylvainkritter | 0:7e50b328a66f | 583 | #define OffsetPixelWidth 18 |
sylvainkritter | 0:7e50b328a66f | 584 | #define OffsetPixelHeigh 22 |
sylvainkritter | 0:7e50b328a66f | 585 | #define OffsetFileSize 34 |
sylvainkritter | 0:7e50b328a66f | 586 | #define OffsetPixData 10 |
sylvainkritter | 0:7e50b328a66f | 587 | #define OffsetBPP 28 |
sylvainkritter | 0:7e50b328a66f | 588 | |
sylvainkritter | 0:7e50b328a66f | 589 | char filename[50]; |
sylvainkritter | 0:7e50b328a66f | 590 | unsigned char BMP_Header[54]; |
sylvainkritter | 0:7e50b328a66f | 591 | unsigned short BPP_t; |
sylvainkritter | 0:7e50b328a66f | 592 | unsigned int PixelWidth,PixelHeigh,start_data; |
sylvainkritter | 0:7e50b328a66f | 593 | unsigned int i,off; |
sylvainkritter | 0:7e50b328a66f | 594 | int padd,j; |
sylvainkritter | 0:7e50b328a66f | 595 | unsigned short *line; |
sylvainkritter | 0:7e50b328a66f | 596 | |
sylvainkritter | 0:7e50b328a66f | 597 | // get the filename |
sylvainkritter | 0:7e50b328a66f | 598 | i=0; |
sylvainkritter | 0:7e50b328a66f | 599 | while (*Name_BMP!='\0') { |
sylvainkritter | 0:7e50b328a66f | 600 | filename[i++]=*Name_BMP++; |
sylvainkritter | 0:7e50b328a66f | 601 | } |
sylvainkritter | 0:7e50b328a66f | 602 | filename[i] = 0; |
sylvainkritter | 0:7e50b328a66f | 603 | |
sylvainkritter | 0:7e50b328a66f | 604 | FILE *Image = fopen((const char *)&filename[0], "rb"); // open the bmp file |
sylvainkritter | 0:7e50b328a66f | 605 | if (!Image) { |
sylvainkritter | 0:7e50b328a66f | 606 | return(0); // error file not found ! |
sylvainkritter | 0:7e50b328a66f | 607 | } |
sylvainkritter | 0:7e50b328a66f | 608 | |
sylvainkritter | 0:7e50b328a66f | 609 | fread(&BMP_Header[0],1,54,Image); // get the BMP Header |
sylvainkritter | 0:7e50b328a66f | 610 | |
sylvainkritter | 0:7e50b328a66f | 611 | if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte |
sylvainkritter | 0:7e50b328a66f | 612 | fclose(Image); |
sylvainkritter | 0:7e50b328a66f | 613 | return(-1); // error no BMP file |
sylvainkritter | 0:7e50b328a66f | 614 | } |
sylvainkritter | 0:7e50b328a66f | 615 | |
sylvainkritter | 0:7e50b328a66f | 616 | BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8); |
sylvainkritter | 0:7e50b328a66f | 617 | if (BPP_t != 0x0010) { |
sylvainkritter | 0:7e50b328a66f | 618 | fclose(Image); |
sylvainkritter | 0:7e50b328a66f | 619 | return(-2); // error no 16 bit BMP |
sylvainkritter | 0:7e50b328a66f | 620 | } |
sylvainkritter | 0:7e50b328a66f | 621 | |
sylvainkritter | 0:7e50b328a66f | 622 | PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24); |
sylvainkritter | 0:7e50b328a66f | 623 | PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24); |
sylvainkritter | 0:7e50b328a66f | 624 | if (PixelHeigh > TFT.height() + y || PixelWidth > TFT.width() + x) { |
sylvainkritter | 0:7e50b328a66f | 625 | fclose(Image); |
sylvainkritter | 0:7e50b328a66f | 626 | return(-3); // to big |
sylvainkritter | 0:7e50b328a66f | 627 | } |
sylvainkritter | 0:7e50b328a66f | 628 | |
sylvainkritter | 0:7e50b328a66f | 629 | start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24); |
sylvainkritter | 0:7e50b328a66f | 630 | |
sylvainkritter | 0:7e50b328a66f | 631 | line = (unsigned short *) malloc (2 * PixelWidth); // we need a buffer for a line |
sylvainkritter | 0:7e50b328a66f | 632 | if (line == NULL) { |
sylvainkritter | 0:7e50b328a66f | 633 | return(-4); // error no memory |
sylvainkritter | 0:7e50b328a66f | 634 | } |
sylvainkritter | 0:7e50b328a66f | 635 | |
sylvainkritter | 0:7e50b328a66f | 636 | // the bmp lines are padded to multiple of 4 bytes |
sylvainkritter | 0:7e50b328a66f | 637 | padd = -1; |
sylvainkritter | 0:7e50b328a66f | 638 | do { |
sylvainkritter | 0:7e50b328a66f | 639 | padd ++; |
sylvainkritter | 0:7e50b328a66f | 640 | } while ((PixelWidth * 2 + padd)%4 != 0); |
sylvainkritter | 0:7e50b328a66f | 641 | |
sylvainkritter | 0:7e50b328a66f | 642 | // GraphicsDisplay.window(x, y,PixelWidth ,PixelHeigh); |
sylvainkritter | 0:7e50b328a66f | 643 | //GraphicsDisplay.wr_cmd(0x2C); // send pixel |
sylvainkritter | 0:7e50b328a66f | 644 | //GraphicsDisplay.spi_16(1); |
sylvainkritter | 0:7e50b328a66f | 645 | int compt=38400; |
sylvainkritter | 0:7e50b328a66f | 646 | unsigned char c,c1; |
sylvainkritter | 0:7e50b328a66f | 647 | for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up |
sylvainkritter | 0:7e50b328a66f | 648 | off = j * (PixelWidth * 2 + padd) + start_data; // start of line |
sylvainkritter | 0:7e50b328a66f | 649 | fseek(Image, off ,SEEK_SET); |
sylvainkritter | 0:7e50b328a66f | 650 | fread(line,1,PixelWidth * 2,Image); // read a line - slow |
sylvainkritter | 0:7e50b328a66f | 651 | // for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT |
sylvainkritter | 0:7e50b328a66f | 652 | for (int i = PixelWidth-1; i >=0; i--) { // copy pixel data to TFT |
sylvainkritter | 0:7e50b328a66f | 653 | compt = compt -1; |
sylvainkritter | 0:7e50b328a66f | 654 | c=line[i]&0x00FF; |
sylvainkritter | 0:7e50b328a66f | 655 | c1=line[i]>>8; |
sylvainkritter | 0:7e50b328a66f | 656 | bank[compt] =c1 ; |
sylvainkritter | 0:7e50b328a66f | 657 | compt = compt -1; |
sylvainkritter | 0:7e50b328a66f | 658 | bank[compt] =c; // one 16 bit pixel |
sylvainkritter | 0:7e50b328a66f | 659 | } |
sylvainkritter | 0:7e50b328a66f | 660 | } |
sylvainkritter | 0:7e50b328a66f | 661 | //spi_bsy(); |
sylvainkritter | 0:7e50b328a66f | 662 | //_cs = 1; |
sylvainkritter | 0:7e50b328a66f | 663 | //spi_16(0); |
sylvainkritter | 0:7e50b328a66f | 664 | free (line); |
sylvainkritter | 0:7e50b328a66f | 665 | fclose(Image); |
sylvainkritter | 0:7e50b328a66f | 666 | //WindowMax(); |
sylvainkritter | 0:7e50b328a66f | 667 | return(1); |
sylvainkritter | 0:7e50b328a66f | 668 | } |
sylvainkritter | 0:7e50b328a66f | 669 | |
sylvainkritter | 0:7e50b328a66f | 670 |