image transformation and pattern matching (very basic)

Dependents:   mycame Practica4_Camara

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?

UserRevisionLine numberNew 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