Tested on Nucleo F411RE Based on OV7670 without FIFO, SCCB protocol rewritten. View on TFT ILI9341, possible capture picture on sd Around 3 frames per second Basic image treatment: zoom, rotation, etc Very basic pattern recognition, pattern being stored on SD, after camera capture, or from .bmp file (rgb 565, 120x160 max)
Dependencies: FastPWM SDFileSystem SPI_TFT_ILI9341 TFT_fonts imagetrlib mbed ov7670s
Revision 3:19b0a9d60055, committed 2016-02-17
- Comitter:
- sylvainkritter
- Date:
- Wed Feb 17 16:48:45 2016 +0000
- Parent:
- 2:7e06db0773c1
- Child:
- 4:3fc38eeb3674
- Commit message:
- create imatr library for image transformation
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imagetr/imagetr.cpp Wed Feb 17 16:48:45 2016 +0000 @@ -0,0 +1,670 @@ +#pragma once +#include "mbed.h" +#include "global.h" +#include "imagetr.h" +#include "SDFileSystem.h" +#include "SPI_TFT_ILI9341.h" + + +//DigitalOut str(PB_3); // internal strobe for debug +//DigitalOut str1(PC_8); // internal strobe for debug + +void imagetr::getimage( const char nf[]) +{ + fp = fopen(nf, "r"); + pc.printf("get %s\r\n", nf); + for (int i=0; i<tmarray; i++) { + + bank[i] =fgetc(fp); + } + fclose(fp); +} + +void imagetr::avera() +{ + int i,j,k,l, av; + for (i=1; i<nl-1; i=i+1) { + for (j=1; j<nc-1; j=j+1) { + av=0; + for (k=0; k<3; k++) { + for (l=0; l<3; l++) { + av=av+banktc[i-1+k][j-1+l]; + } + } + banktc[i][j]=av/9; + } + } +} + + +void imagetr::extrta() +{ + for (int i=120-nlta; i<120; i++) { + for (int j=0; j<ncta; j++) { + bankta[i-120+nlta][j][0]=banktc[i][j]; + } + } +} +int imagetr::ar(float a) +{ + int ai; + ai=a; + if (a-ai >=0.5f) { + return a+1; + } else { + return a; + } +} + +void imagetr::affine (int x, int y, float a, float z) +{ + float cosa, sina, tif, tjf, dx, dy ; + int ti,tj,i,j, tm1i, tm1j, til, tih, tjl, tjh; + cosa=cos(a); + sina=sin(a); + for (i=0; i<nl; i++) { + for (j=0; j<nc; j++) { + banktc[i][j]=25; + } + } + for (i=0; i<nl; i++) { + for (j=0; j<nc; j++) { + + dx=i-61; + dy=j-80; + tif=dx*cosa - dy*sina + 60; + tjf=dx*sina + dy*cosa + 80; + tif=tif-x; + tjf=tjf-y; + ti=ar((tif-60) * z + 60); + tj=ar((tjf-80) * z + 80 ); + tm1i =ti; + if (tm1i<0) { + tm1i=0; + } + if (tm1i>nl-1) { + tm1i=nl-1; + } + + dx=i-60; + dy=j-81; + tif=dx*cosa - dy*sina + 60; + tjf=dx*sina + dy*cosa + 80; + tif=tif-x; + tjf=tjf-y; + ti=ar((tif-60) * z + 60); + tj=ar((tjf-80) * z + 80 ); + tm1j =tj; + if (tm1j<0) { + tm1j=0; + } + if (tm1j>=nc) { + tm1j=nc-1; + } + + dx=i-60; + dy=j-80; + tif=dx*cosa - dy*sina + 60; + tjf=dx*sina + dy*cosa + 80; + tif=tif-x; + tjf=tjf-y; + ti=ar((tif-60) * z + 60); + tj=ar((tjf-80) * z + 80 ); + + if((ti>=0) && (tj >=0) && (ti <nl) && (tj < nc)) { + banktc[ti][tj]=bankt[i][j]; + if (ti> tm1i) { + til = tm1i; + tih = ti; + } else { + til =ti; + tih = tm1i; + } + + if (tj> tm1j) { + tjl = tm1j; + tjh = tj; + } else { + tjl =tj; + tjh = tm1j; + } + for (int k = til; k<tih+1; k++) { + for (int l = tjl; l<tjh+1; l++) { + banktc[k][l]=bankt[i][j]; + } + } + } + } + + } +} +void imagetr::genta (float tx, float ty, float a, float z) +{ + // generate multiple ta + float cosa, sina, tif, tjf, dx, dy ; + int ti,tj,i,j, tm1i, tm1j, til, tih, tjl, tjh; + cosa=cos(a); + sina=sin(a); + int nlta2=nlta/2; + int ncta2=ncta/2; + for (i=0; i<nlta; i++) { + for (j=0; j<ncta; j++) { + banktatc[i][j]=25; + } + } + for (i=0; i<nlta; i++) { + for (j=0; j<ncta; j++) { + + dx=(i-nlta2-1)*tx; + dy=(j-ncta2)*ty; + tif=dx*cosa - dy*sina + nlta2; + tjf=dx*sina + dy*cosa + ncta2; + ti=ar((tif-nlta2) * z + nlta2); + tj=ar((tjf-ncta2) * z + ncta2 ); + tm1i =ti; + if (tm1i<0) { + tm1i=0; + } + if (tm1i>nlta-1) { + tm1i=nlta-1; + } + dx=(i-nlta2)*tx; + dy=(j-ncta2-1)*ty; + tif=dx*cosa - dy*sina + nlta2; + tjf=dx*sina + dy*cosa + ncta2; + ti=ar((tif-nlta2) * z + nlta2); + tj=ar((tjf-ncta2) * z + ncta2 ); + tm1j =tj; + if (tm1j<0) { + tm1j=0; + } + if (tm1j>=ncta) { + tm1j=ncta-1; + } + + dx=(i-nlta2)*tx; + dy=(j-ncta2)*ty; + tif=dx*cosa - dy*sina + nlta2; + tjf=dx*sina + dy*cosa + ncta2; + ti=ar((tif-nlta2) * z + nlta2); + tj=ar((tjf-ncta2) * z + ncta2 ); + + if((ti>=0) && (tj >=0) && (ti <nlta) && (tj < ncta)) { + banktatc[ti][tj]=bankta[i][j][0]; + if (ti> tm1i) { + til = tm1i; + tih = ti; + } else { + til =ti; + tih = tm1i; + } + + if (tj> tm1j) { + tjl = tm1j; + tjh = tj; + } else { + tjl =tj; + tjh = tm1j; + } + for (int k = til; k<tih+1; k++) { + for (int l = tjl; l<tjh+1; l++) { + banktatc[k][l]=bankta[i][j][0]; + } + } + } + } + + } + +} +void imagetr::lumi (float z) +{ + int i,j; + for (i=0; i<nl; i++) { + for (j=0; j<nc; j++) { + banktc[i][j]=banktc[i][j]*z; + } + } +} + +void imagetr::rgbtoy(void) +{ + //transform bank in Y in table bankt + int R,G,G1,B,Y; + for (int i=0; i<tmarray; i=i+2) { + + R=(bank[i+1]>>3); + G=(bank[i+1]&0x07)<<3; + + G1=bank[i]>>5; + G= G|G1; + B=bank[i]&0x1f; + + Y=ar(0.299f*R+0.587f*G+0.114f*B); + //pc.printf("i:%d\r\n",i); + bankt[i/nc2][(i/2)%nc]=Y; + } +} +void imagetr::rgbtoyta(void) +{ + //transform bank in Y in table bankta, create muliple view + int R,G,G1,B,Y; + for (int i=0; i<tmarrayta; i=i+2) { + R=(bank[i+1]>>3); + G=(bank[i+1]&0x07)<<3; + + G1=bank[i]>>5; + G= G|G1; + B=bank[i]&0x1f; + + Y=ar(0.299f*R+0.587f*G+0.114f*B); + bankta[i/nc2ta][(i/2)%ncta][0]=Y; + } + + + genta (1, 1, 0.17, 1); // 10 deg + for (int i=0; i<nlta; i=i+1) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][1]= banktatc[i][j]; + } + } + genta (1, 1, -0.17, 1); // -10 deg + for (int i=0; i<nlta; i=i+1) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][2]= banktatc[i][j]; + } + } + genta (1, 1, 0, 0.8); // zoom 0.8 + for (int i=0; i<nlta; i++) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][3]= banktatc[i][j]; + } + } + genta (1, 1, 0, 1.20); // zoom 1.2 + for (int i=0; i<nlta; i++) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][4]= banktatc[i][j]; + } + }/* + genta (0.9, 1, 0, 1); + for (int i=0; i<nlta; i=i+1) { + for (int j=0; j<ncta; j=j+1) { + // pc.printf("i %d, j %d b %02x\r\n", i, j, bankta[i][j][0]); + bankta[i][j][5]= banktatc[i][j]; + } + } + //pc.printf("ty\r\n"); + genta (1, 0.9, 0, 1); + for (int i=0; i<nlta; i=i+1) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][6]= banktatc[i][j]; + } + }*/ +} + + +void imagetr::rgbtoytaed(void) +{ + //transform bank in Y in table bankta, create muliple view + int R,G,G1,B,Y; + for (int i=0; i<tmarrayta; i=i+2) { + R=(bank[i+1]>>3); + G=(bank[i+1]&0x07)<<3; + + G1=bank[i]>>5; + G= G|G1; + B=bank[i]&0x1f; + + Y=ar(0.299f*R+0.587f*G+0.114f*B); + bankta[i/nc2ta][(i/2)%ncta][0]=Y; + } + + extedgeta(0,0,2); + + for (int i=0; i<nlta; i=i+1) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][0]= banktatc[i][j]; + } + } + + genta (1, 1, 0.17, 1); // 10 deg + for (int i=0; i<nlta; i=i+1) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][1]= banktatc[i][j]; + } + } + genta (1, 1, -0.17, 1); // -10 deg + for (int i=0; i<nlta; i=i+1) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][2]= banktatc[i][j]; + } + } + genta (1, 1, 0, 0.8); // zoom 0.8 + for (int i=0; i<nlta; i++) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][3]= banktatc[i][j]; + } + } + genta (1, 1, 0, 1.20); // zoom 1.2 + for (int i=0; i<nlta; i++) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][4]= banktatc[i][j]; + } + }/* + genta (0.9, 1, 0, 1); + for (int i=0; i<nlta; i=i+1) { + for (int j=0; j<ncta; j=j+1) { + // pc.printf("i %d, j %d b %02x\r\n", i, j, bankta[i][j][0]); + bankta[i][j][5]= banktatc[i][j]; + } + } + //pc.printf("ty\r\n"); + genta (1, 0.9, 0, 1); + for (int i=0; i<nlta; i=i+1) { + for (int j=0; j<ncta; j=j+1) { + bankta[i][j][6]= banktatc[i][j]; + } + }*/ +} + + + + +void imagetr::ytorgb(unsigned char b[nl][nc]) +{ + //populate bank with table b + int R,G,G1,B,Y; + for (int i=0; i<tarray; i=i+1) { + + Y=b[i/nc][i%nc]; + // Y=Y*yco; + R=Y*0.71; + if (R>31) { + R=31; + } + G=Y*1.45; + if (G>63) { + G=63; + } + B=R; + G1=G>>3; + bank[2*i+1]=R<<3|G1; + bank[2*i]=G<<5|B; + } +} + +void imagetr::ytorgbta(unsigned char b[nlta][ncta][nv], int nu,const char des[]) +{ + //p0pulate bankf with table b special target, write targetf.txt + int R,G,G1,B,Y; + fp = fopen(des, "w"); + for (int j=0; j<tmarray; j++) { + bank[j]=25; + } + for (int i=0; i<tarrayta; i=i+1) { + + Y=b[i/ncta][i%ncta][nu]; + // Y=Y*yco; + R=Y*0.71; + if (R>31) { + R=31; + } + G=Y*1.45; + if (G>63) { + G=63; + } + B=R; + G1=G>>3; + bank[2*i+1]=R<<3|G1; + bank[2*i]=G<<5|B; + fputc(bank[2*i], fp); + fputc(bank[2*i+1], fp); + + } + fclose(fp); +} +void imagetr::ytorgbtas(unsigned char b[nlta][ncta][nv], int nu) +{ + //p0pulate bank with table b special target, without write targetfile + int R,G,G1,B,Y; + + for (int j=0; j<tmarray; j++) { + bank[j]=25; + } + for (int i=0; i<tarrayta; i=i+1) { + + Y=b[i/ncta][i%ncta][nu]; + // Y=Y*yco; + R=Y*0.71; + if (R>31) { + R=31; + } + G=Y*1.45; + if (G>63) { + G=63; + } + B=R; + G1=G>>3; + bank[2*i+1]=R<<3|G1; + bank[2*i]=G<<5|B; + } +} + +void imagetr::extcont(int minc, int maxc) +{ + // contrast expand + int Y; + for (int i=0; i<tarray; i=i+1) { + + Y=bankt[i/nc][i%nc]; + if (Y<=minc) { + Y=0; + } + if (Y>=maxc) { + Y=50; + } + banktc[i/nc][i%nc]=Y; + } +} +void imagetr::extedge(int minc, int maxc, int th) +{ + //edge extract + int Y,YG,YH,i,j; + int M=0; + for (i=0; i<nl; i++) { + for (j=0; j<nc; j++) { + M=M+bankt[i][j]; + + } + } + M=M/tarray; + // if (M>maxc ||M<minc) { + // th=1; + // } else { + // th=4; + // } + // th=6*M/minc; + // pc.printf( "M: %d th %d: minc: %d maxc; %d \r\n",M,th, minc, maxc); + for (i=1; i<nl; i++) { + for (j=1; j<nc; j++) { + Y=bankt[i][j]; + YG=bankt[i][j-1]; + YH=bankt[i-1][j]; + if (abs(Y-YG) >th||abs(Y-YH) >th) { + Y=50; + } else { + Y=0; + } + banktc[i][j]=Y; + } + } +} +void imagetr::extedgeta(int minc, int maxc, int th) +{ + //edge extract + int Y,YG,YH,i,j; + int M=0; + for (i=0; i<nlta; i++) { + for (j=0; j<ncta; j++) { + M=M+bankta[i][j][0]; + + } + } + M=M/tarray; + // if (M>maxc ||M<minc) { + // th=1; + // } else { + // th=4; + // } + // th=6*M/minc; + // pc.printf( "M: %d th %d: minc: %d maxc; %d \r\n",M,th, minc, maxc); + for (i=1; i<nlta; i++) { + for (j=1; j<ncta; j++) { + Y=bankta[i][j][0]; + YG=bankta[i][j-1][0]; + YH=bankta[i-1][j][0]; + if (abs(Y-YG) >th||abs(Y-YH) >th) { + Y=50; + } else { + Y=0; + } + banktatc[i][j]=Y; + } + } +} + + +void imagetr::searchpat(int th, char name[]) +{ + int i,j,k, l, maxi, maxj, car, tt,n; + Time.start(); + for (n=0; n<=nv; n++) { + for (i =0 ; i < nl-nlta; i++) { + for (j=0; j<nc-ncta; j++) { + tt=0; + for (k=0; k<nlta; k++) { + for (l=0; l<ncta; l++) { + car= bankta[k][l][n]-banktc[i+k][j+l]; + tt=tt+(car*car); + if (tt>th) { + break; + } + } + } + if (tt<th) { + maxi=i; + maxj=j; + i=nl; + j=nc; + n=nv; + } + } + } + } + Time.stop(); + if (tt<th) { + //pc.printf("line: %d, column: %d, n: %d max: %d time: %f \r\n",maxi,maxj,n0,tt, Time.read()); + TFT.locate(160,20); + printf("Pat found %4.2f s",Time.read()); + TFT.locate(160+maxj+(ncta/2),240-maxi-(nlta/2)); + printf(name); + TFT.rect(160+maxj,240-maxi-nlta,160+maxj+ncta,240-maxi,Red); + } else { + TFT.locate(160,20); + printf("Not found %4.2f s",Time.read()); + //pc.printf("not found time: %4f n:%d max: %d \r\n",Time.read(), n0,tt); + } + Time.reset(); +} + +int imagetr::BMP_tofile(unsigned int x, unsigned int y, const char *Name_BMP) +{ + +#define OffsetPixelWidth 18 +#define OffsetPixelHeigh 22 +#define OffsetFileSize 34 +#define OffsetPixData 10 +#define OffsetBPP 28 + + char filename[50]; + unsigned char BMP_Header[54]; + unsigned short BPP_t; + unsigned int PixelWidth,PixelHeigh,start_data; + unsigned int i,off; + int padd,j; + unsigned short *line; + + // get the filename + i=0; + while (*Name_BMP!='\0') { + filename[i++]=*Name_BMP++; + } + filename[i] = 0; + + FILE *Image = fopen((const char *)&filename[0], "rb"); // open the bmp file + if (!Image) { + return(0); // error file not found ! + } + + fread(&BMP_Header[0],1,54,Image); // get the BMP Header + + if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte + fclose(Image); + return(-1); // error no BMP file + } + + BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8); + if (BPP_t != 0x0010) { + fclose(Image); + return(-2); // error no 16 bit BMP + } + + PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24); + PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24); + if (PixelHeigh > TFT.height() + y || PixelWidth > TFT.width() + x) { + fclose(Image); + return(-3); // to big + } + + start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24); + + line = (unsigned short *) malloc (2 * PixelWidth); // we need a buffer for a line + if (line == NULL) { + return(-4); // error no memory + } + + // the bmp lines are padded to multiple of 4 bytes + padd = -1; + do { + padd ++; + } while ((PixelWidth * 2 + padd)%4 != 0); + + // GraphicsDisplay.window(x, y,PixelWidth ,PixelHeigh); + //GraphicsDisplay.wr_cmd(0x2C); // send pixel + //GraphicsDisplay.spi_16(1); + int compt=38400; + unsigned char c,c1; + for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up + off = j * (PixelWidth * 2 + padd) + start_data; // start of line + fseek(Image, off ,SEEK_SET); + fread(line,1,PixelWidth * 2,Image); // read a line - slow + // for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT + for (int i = PixelWidth-1; i >=0; i--) { // copy pixel data to TFT + compt = compt -1; + c=line[i]&0x00FF; + c1=line[i]>>8; + bank[compt] =c1 ; + compt = compt -1; + bank[compt] =c; // one 16 bit pixel + } + } + //spi_bsy(); + //_cs = 1; + //spi_16(0); + free (line); + fclose(Image); + //WindowMax(); + return(1); +} + +
--- a/imagetr/imagetr.h Wed Feb 17 16:37:01 2016 +0000 +++ b/imagetr/imagetr.h Wed Feb 17 16:48:45 2016 +0000 @@ -3,10 +3,7 @@ #include "global.h" #include "SDFileSystem.h" #include "SPI_TFT_ILI9341.h" -#include "Arial12x12.h" -#include "Arial24x23.h" -#include "Arial28x28.h" -#include "font_big.h" + const int nc2=nc*2; const int nc2ta=ncta*2; @@ -21,10 +18,8 @@ extern unsigned char bankf[]; extern unsigned char bankt[nl][nc]; extern unsigned char banktc[nl][nc]; -unsigned char bankta[nlta][ncta][nv]; -unsigned char banktatc[nlta][ncta]; - - +extern unsigned char bankta[nlta][ncta][nv]; +extern unsigned char banktatc[nlta][ncta]; extern Timer Time; extern FILE *fp; @@ -57,668 +52,4 @@ }; -imagetr imagetr; -//DigitalOut str(PB_3); // internal strobe for debug -//DigitalOut str1(PC_8); // internal strobe for debug - -void imagetr::getimage( const char nf[]) -{ - fp = fopen(nf, "r"); - pc.printf("get %s\r\n", nf); - for (int i=0; i<tmarray; i++) { - - bank[i] =fgetc(fp); - } - fclose(fp); -} - -void imagetr::avera() -{ - int i,j,k,l, av; - for (i=1; i<nl-1; i=i+1) { - for (j=1; j<nc-1; j=j+1) { - av=0; - for (k=0; k<3; k++) { - for (l=0; l<3; l++) { - av=av+banktc[i-1+k][j-1+l]; - } - } - banktc[i][j]=av/9; - } - } -} - - -void imagetr::extrta() -{ - for (int i=120-nlta; i<120; i++) { - for (int j=0; j<ncta; j++) { - bankta[i-120+nlta][j][0]=banktc[i][j]; - } - } -} -int imagetr::ar(float a) -{ - int ai; - ai=a; - if (a-ai >=0.5f) { - return a+1; - } else { - return a; - } -} - -void imagetr::affine (int x, int y, float a, float z) -{ - float cosa, sina, tif, tjf, dx, dy ; - int ti,tj,i,j, tm1i, tm1j, til, tih, tjl, tjh; - cosa=cos(a); - sina=sin(a); - for (i=0; i<nl; i++) { - for (j=0; j<nc; j++) { - banktc[i][j]=25; - } - } - for (i=0; i<nl; i++) { - for (j=0; j<nc; j++) { - - dx=i-61; - dy=j-80; - tif=dx*cosa - dy*sina + 60; - tjf=dx*sina + dy*cosa + 80; - tif=tif-x; - tjf=tjf-y; - ti=ar((tif-60) * z + 60); - tj=ar((tjf-80) * z + 80 ); - tm1i =ti; - if (tm1i<0) { - tm1i=0; - } - if (tm1i>nl-1) { - tm1i=nl-1; - } - - dx=i-60; - dy=j-81; - tif=dx*cosa - dy*sina + 60; - tjf=dx*sina + dy*cosa + 80; - tif=tif-x; - tjf=tjf-y; - ti=ar((tif-60) * z + 60); - tj=ar((tjf-80) * z + 80 ); - tm1j =tj; - if (tm1j<0) { - tm1j=0; - } - if (tm1j>=nc) { - tm1j=nc-1; - } - - dx=i-60; - dy=j-80; - tif=dx*cosa - dy*sina + 60; - tjf=dx*sina + dy*cosa + 80; - tif=tif-x; - tjf=tjf-y; - ti=ar((tif-60) * z + 60); - tj=ar((tjf-80) * z + 80 ); - - if((ti>=0) && (tj >=0) && (ti <nl) && (tj < nc)) { - banktc[ti][tj]=bankt[i][j]; - if (ti> tm1i) { - til = tm1i; - tih = ti; - } else { - til =ti; - tih = tm1i; - } - - if (tj> tm1j) { - tjl = tm1j; - tjh = tj; - } else { - tjl =tj; - tjh = tm1j; - } - for (int k = til; k<tih+1; k++) { - for (int l = tjl; l<tjh+1; l++) { - banktc[k][l]=bankt[i][j]; - } - } - } - } - - } -} -void imagetr::genta (float tx, float ty, float a, float z) -{ - // generate multiple ta - float cosa, sina, tif, tjf, dx, dy ; - int ti,tj,i,j, tm1i, tm1j, til, tih, tjl, tjh; - cosa=cos(a); - sina=sin(a); - int nlta2=nlta/2; - int ncta2=ncta/2; - for (i=0; i<nlta; i++) { - for (j=0; j<ncta; j++) { - banktatc[i][j]=25; - } - } - for (i=0; i<nlta; i++) { - for (j=0; j<ncta; j++) { - - dx=(i-nlta2-1)*tx; - dy=(j-ncta2)*ty; - tif=dx*cosa - dy*sina + nlta2; - tjf=dx*sina + dy*cosa + ncta2; - ti=ar((tif-nlta2) * z + nlta2); - tj=ar((tjf-ncta2) * z + ncta2 ); - tm1i =ti; - if (tm1i<0) { - tm1i=0; - } - if (tm1i>nlta-1) { - tm1i=nlta-1; - } - dx=(i-nlta2)*tx; - dy=(j-ncta2-1)*ty; - tif=dx*cosa - dy*sina + nlta2; - tjf=dx*sina + dy*cosa + ncta2; - ti=ar((tif-nlta2) * z + nlta2); - tj=ar((tjf-ncta2) * z + ncta2 ); - tm1j =tj; - if (tm1j<0) { - tm1j=0; - } - if (tm1j>=ncta) { - tm1j=ncta-1; - } - - dx=(i-nlta2)*tx; - dy=(j-ncta2)*ty; - tif=dx*cosa - dy*sina + nlta2; - tjf=dx*sina + dy*cosa + ncta2; - ti=ar((tif-nlta2) * z + nlta2); - tj=ar((tjf-ncta2) * z + ncta2 ); - - if((ti>=0) && (tj >=0) && (ti <nlta) && (tj < ncta)) { - banktatc[ti][tj]=bankta[i][j][0]; - if (ti> tm1i) { - til = tm1i; - tih = ti; - } else { - til =ti; - tih = tm1i; - } - - if (tj> tm1j) { - tjl = tm1j; - tjh = tj; - } else { - tjl =tj; - tjh = tm1j; - } - for (int k = til; k<tih+1; k++) { - for (int l = tjl; l<tjh+1; l++) { - banktatc[k][l]=bankta[i][j][0]; - } - } - } - } - - } - -} -void imagetr::lumi (float z) -{ - int i,j; - for (i=0; i<nl; i++) { - for (j=0; j<nc; j++) { - banktc[i][j]=banktc[i][j]*z; - } - } -} - -void imagetr::rgbtoy(void) -{ - //transform bank in Y in table bankt - int R,G,G1,B,Y; - for (int i=0; i<tmarray; i=i+2) { - - R=(bank[i+1]>>3); - G=(bank[i+1]&0x07)<<3; - - G1=bank[i]>>5; - G= G|G1; - B=bank[i]&0x1f; - - Y=ar(0.299f*R+0.587f*G+0.114f*B); - //pc.printf("i:%d\r\n",i); - bankt[i/nc2][(i/2)%nc]=Y; - } -} -void imagetr::rgbtoyta(void) -{ - //transform bank in Y in table bankta, create muliple view - int R,G,G1,B,Y; - for (int i=0; i<tmarrayta; i=i+2) { - R=(bank[i+1]>>3); - G=(bank[i+1]&0x07)<<3; - - G1=bank[i]>>5; - G= G|G1; - B=bank[i]&0x1f; - - Y=ar(0.299f*R+0.587f*G+0.114f*B); - bankta[i/nc2ta][(i/2)%ncta][0]=Y; - } - - - genta (1, 1, 0.17, 1); // 10 deg - for (int i=0; i<nlta; i=i+1) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][1]= banktatc[i][j]; - } - } - genta (1, 1, -0.17, 1); // -10 deg - for (int i=0; i<nlta; i=i+1) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][2]= banktatc[i][j]; - } - } - genta (1, 1, 0, 0.8); // zoom 0.8 - for (int i=0; i<nlta; i++) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][3]= banktatc[i][j]; - } - } - genta (1, 1, 0, 1.20); // zoom 1.2 - for (int i=0; i<nlta; i++) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][4]= banktatc[i][j]; - } - }/* - genta (0.9, 1, 0, 1); - for (int i=0; i<nlta; i=i+1) { - for (int j=0; j<ncta; j=j+1) { - // pc.printf("i %d, j %d b %02x\r\n", i, j, bankta[i][j][0]); - bankta[i][j][5]= banktatc[i][j]; - } - } - //pc.printf("ty\r\n"); - genta (1, 0.9, 0, 1); - for (int i=0; i<nlta; i=i+1) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][6]= banktatc[i][j]; - } - }*/ -} - - -void imagetr::rgbtoytaed(void) -{ - //transform bank in Y in table bankta, create muliple view - int R,G,G1,B,Y; - for (int i=0; i<tmarrayta; i=i+2) { - R=(bank[i+1]>>3); - G=(bank[i+1]&0x07)<<3; - - G1=bank[i]>>5; - G= G|G1; - B=bank[i]&0x1f; - - Y=ar(0.299f*R+0.587f*G+0.114f*B); - bankta[i/nc2ta][(i/2)%ncta][0]=Y; - } - - extedgeta(0,0,2); - - for (int i=0; i<nlta; i=i+1) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][0]= banktatc[i][j]; - } - } - - genta (1, 1, 0.17, 1); // 10 deg - for (int i=0; i<nlta; i=i+1) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][1]= banktatc[i][j]; - } - } - genta (1, 1, -0.17, 1); // -10 deg - for (int i=0; i<nlta; i=i+1) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][2]= banktatc[i][j]; - } - } - genta (1, 1, 0, 0.8); // zoom 0.8 - for (int i=0; i<nlta; i++) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][3]= banktatc[i][j]; - } - } - genta (1, 1, 0, 1.20); // zoom 1.2 - for (int i=0; i<nlta; i++) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][4]= banktatc[i][j]; - } - }/* - genta (0.9, 1, 0, 1); - for (int i=0; i<nlta; i=i+1) { - for (int j=0; j<ncta; j=j+1) { - // pc.printf("i %d, j %d b %02x\r\n", i, j, bankta[i][j][0]); - bankta[i][j][5]= banktatc[i][j]; - } - } - //pc.printf("ty\r\n"); - genta (1, 0.9, 0, 1); - for (int i=0; i<nlta; i=i+1) { - for (int j=0; j<ncta; j=j+1) { - bankta[i][j][6]= banktatc[i][j]; - } - }*/ -} - - - - -void imagetr::ytorgb(unsigned char b[nl][nc]) -{ - //populate bank with table b - int R,G,G1,B,Y; - for (int i=0; i<tarray; i=i+1) { - - Y=b[i/nc][i%nc]; - // Y=Y*yco; - R=Y*0.71; - if (R>31) { - R=31; - } - G=Y*1.45; - if (G>63) { - G=63; - } - B=R; - G1=G>>3; - bank[2*i+1]=R<<3|G1; - bank[2*i]=G<<5|B; - } -} - -void imagetr::ytorgbta(unsigned char b[nlta][ncta][nv], int nu,const char des[]) -{ - //p0pulate bankf with table b special target, write targetf.txt - int R,G,G1,B,Y; - fp = fopen(des, "w"); - for (int j=0; j<tmarray; j++) { - bank[j]=25; - } - for (int i=0; i<tarrayta; i=i+1) { - - Y=b[i/ncta][i%ncta][nu]; - // Y=Y*yco; - R=Y*0.71; - if (R>31) { - R=31; - } - G=Y*1.45; - if (G>63) { - G=63; - } - B=R; - G1=G>>3; - bank[2*i+1]=R<<3|G1; - bank[2*i]=G<<5|B; - fputc(bank[2*i], fp); - fputc(bank[2*i+1], fp); - - } - fclose(fp); -} -void imagetr::ytorgbtas(unsigned char b[nlta][ncta][nv], int nu) -{ - //p0pulate bank with table b special target, without write targetfile - int R,G,G1,B,Y; - - for (int j=0; j<tmarray; j++) { - bank[j]=25; - } - for (int i=0; i<tarrayta; i=i+1) { - - Y=b[i/ncta][i%ncta][nu]; - // Y=Y*yco; - R=Y*0.71; - if (R>31) { - R=31; - } - G=Y*1.45; - if (G>63) { - G=63; - } - B=R; - G1=G>>3; - bank[2*i+1]=R<<3|G1; - bank[2*i]=G<<5|B; - } -} - -void imagetr::extcont(int minc, int maxc) -{ - // contrast expand - int Y; - for (int i=0; i<tarray; i=i+1) { - - Y=bankt[i/nc][i%nc]; - if (Y<=minc) { - Y=0; - } - if (Y>=maxc) { - Y=50; - } - banktc[i/nc][i%nc]=Y; - } -} -void imagetr::extedge(int minc, int maxc, int th) -{ - //edge extract - int Y,YG,YH,i,j; - int M=0; - for (i=0; i<nl; i++) { - for (j=0; j<nc; j++) { - M=M+bankt[i][j]; - - } - } - M=M/tarray; - // if (M>maxc ||M<minc) { - // th=1; - // } else { - // th=4; - // } - // th=6*M/minc; - // pc.printf( "M: %d th %d: minc: %d maxc; %d \r\n",M,th, minc, maxc); - for (i=1; i<nl; i++) { - for (j=1; j<nc; j++) { - Y=bankt[i][j]; - YG=bankt[i][j-1]; - YH=bankt[i-1][j]; - if (abs(Y-YG) >th||abs(Y-YH) >th) { - Y=50; - } else { - Y=0; - } - banktc[i][j]=Y; - } - } -} -void imagetr::extedgeta(int minc, int maxc, int th) -{ - //edge extract - int Y,YG,YH,i,j; - int M=0; - for (i=0; i<nlta; i++) { - for (j=0; j<ncta; j++) { - M=M+bankta[i][j][0]; - - } - } - M=M/tarray; - // if (M>maxc ||M<minc) { - // th=1; - // } else { - // th=4; - // } - // th=6*M/minc; - // pc.printf( "M: %d th %d: minc: %d maxc; %d \r\n",M,th, minc, maxc); - for (i=1; i<nlta; i++) { - for (j=1; j<ncta; j++) { - Y=bankta[i][j][0]; - YG=bankta[i][j-1][0]; - YH=bankta[i-1][j][0]; - if (abs(Y-YG) >th||abs(Y-YH) >th) { - Y=50; - } else { - Y=0; - } - banktatc[i][j]=Y; - } - } -} - - -void imagetr::searchpat(int th, char name[]) -{ - int i,j,k, l, maxi, maxj, car, tt,n; - Time.start(); - for (n=0; n<=nv; n++) { - for (i =0 ; i < nl-nlta; i++) { - for (j=0; j<nc-ncta; j++) { - tt=0; - for (k=0; k<nlta; k++) { - for (l=0; l<ncta; l++) { - car= bankta[k][l][n]-banktc[i+k][j+l]; - tt=tt+(car*car); - if (tt>th) { - break; - } - } - } - if (tt<th) { - maxi=i; - maxj=j; - i=nl; - j=nc; - n=nv; - } - } - } - } - Time.stop(); - if (tt<th) { - //pc.printf("line: %d, column: %d, n: %d max: %d time: %f \r\n",maxi,maxj,n0,tt, Time.read()); - TFT.locate(160,20); - printf("Pat found %4.2f s",Time.read()); - TFT.locate(160+maxj+(ncta/2),240-maxi-(nlta/2)); - printf(name); - TFT.rect(160+maxj,240-maxi-nlta,160+maxj+ncta,240-maxi,Red); - } else { - TFT.locate(160,20); - printf("Not found %4.2f s",Time.read()); - //pc.printf("not found time: %4f n:%d max: %d \r\n",Time.read(), n0,tt); - } - Time.reset(); -} - -int imagetr::BMP_tofile(unsigned int x, unsigned int y, const char *Name_BMP) -{ - -#define OffsetPixelWidth 18 -#define OffsetPixelHeigh 22 -#define OffsetFileSize 34 -#define OffsetPixData 10 -#define OffsetBPP 28 - - char filename[50]; - unsigned char BMP_Header[54]; - unsigned short BPP_t; - unsigned int PixelWidth,PixelHeigh,start_data; - unsigned int i,off; - int padd,j; - unsigned short *line; - - // get the filename - i=0; - while (*Name_BMP!='\0') { - filename[i++]=*Name_BMP++; - } - filename[i] = 0; - - FILE *Image = fopen((const char *)&filename[0], "rb"); // open the bmp file - if (!Image) { - return(0); // error file not found ! - } - - fread(&BMP_Header[0],1,54,Image); // get the BMP Header - - if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte - fclose(Image); - return(-1); // error no BMP file - } - - BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8); - if (BPP_t != 0x0010) { - fclose(Image); - return(-2); // error no 16 bit BMP - } - - PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24); - PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24); - if (PixelHeigh > TFT.height() + y || PixelWidth > TFT.width() + x) { - fclose(Image); - return(-3); // to big - } - - start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24); - - line = (unsigned short *) malloc (2 * PixelWidth); // we need a buffer for a line - if (line == NULL) { - return(-4); // error no memory - } - - // the bmp lines are padded to multiple of 4 bytes - padd = -1; - do { - padd ++; - } while ((PixelWidth * 2 + padd)%4 != 0); - - // GraphicsDisplay.window(x, y,PixelWidth ,PixelHeigh); - //GraphicsDisplay.wr_cmd(0x2C); // send pixel - //GraphicsDisplay.spi_16(1); - int compt=38400; - unsigned char c,c1; - for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up - off = j * (PixelWidth * 2 + padd) + start_data; // start of line - fseek(Image, off ,SEEK_SET); - fread(line,1,PixelWidth * 2,Image); // read a line - slow - // for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT - for (int i = PixelWidth-1; i >=0; i--) { // copy pixel data to TFT - compt = compt -1; - c=line[i]&0x00FF; - c1=line[i]>>8; - bank[compt] =c1 ; - compt = compt -1; - bank[compt] =c; // one 16 bit pixel - } - } - //spi_bsy(); - //_cs = 1; - //spi_16(0); - free (line); - fclose(Image); - //WindowMax(); - return(1); -} - - -
--- a/main.cpp Wed Feb 17 16:37:01 2016 +0000 +++ b/main.cpp Wed Feb 17 16:48:45 2016 +0000 @@ -6,6 +6,10 @@ #include "ov7670sreg.h" #include "SPI_TFT_ILI9341.h" #include "SDFileSystem.h" +#include "Arial12x12.h" +#include "Arial24x23.h" +#include "Arial28x28.h" +#include "font_big.h" #define SCTFT PA_5 // sclk TFT #define MISOTFT PA_6 //miso TFT @@ -65,6 +69,7 @@ SDFileSystem sd(MOSD, MISD, SCSD, PD_2, "sd",NC,SDFileSystem::SWITCH_NONE,2500000); // mosi, miso, sclk, cs, cd unused, switchtype, speed spi +imagetr imagetr; char desfile[25]; char patfile[25]; @@ -72,6 +77,8 @@ const int tmarray = nc*2*nl; unsigned char bank[tmarray]; unsigned char bankt[nl][nc]; +unsigned char bankta[nlta][ncta][nv]; +unsigned char banktatc[nlta][ncta]; unsigned char bankf[tmarray]; unsigned char banktc[nl][nc];