process.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "process.h"
  2. #include "main.h"
  3. #include "common.h"
  4. #include "image.h"
  5. #include "paint.h"
  6. double get_s()
  7. {
  8. double ret;
  9. struct timespec t;
  10. clock_gettime(CLOCK_REALTIME, &t);
  11. ret=((double)t.tv_nsec)/1000000000.0+((double)t.tv_sec);
  12. return ret;
  13. }
  14. void minimise(int w, int h, uint8_t* out, image_t* iout, const image_t* in)
  15. {
  16. int i,j,x,y;
  17. int dx=in->w/w;
  18. int dy=in->h/h;
  19. for(i=0, x=0; i<in->w; i+=dx, x++)
  20. {
  21. for(j=0, y=0; j<in->h; j+=dy, y++)
  22. {
  23. int k,l, nr=0, ng=0, nb=0, nm=0;
  24. for(k=i; k<i+dx && k<in->w; k++)
  25. {
  26. for(l=j; l<j+dy && l<in->h; l++)
  27. {
  28. //IMG_SET(iout, k,l, IMG_GET(in,k,l));
  29. nr+=IMG_GET_R(in, k,l);
  30. ng+=IMG_GET_G(in, k,l);
  31. nb+=IMG_GET_B(in, k,l);
  32. nm+=IMG_GET_M(in, k,l);
  33. }
  34. }
  35. ng/=(dx*dy);
  36. nr/=(dx*dy);
  37. nb/=(dx*dy);
  38. nm/=(dx*dy);
  39. if(nr>200) nr=255; else nr=0;
  40. if(ng>200) ng=255; else ng=0;
  41. if(nb>200) nb=255; else nb=0;
  42. fill_rect(iout,POINT(i,j), POINT(dx,dy), COLOR_RGB(nr,ng,nb));
  43. if(ng>200 && nr+ng<200)
  44. {
  45. out[y*w+x]|=1;
  46. //fill_rect(iout,POINT(i,j), POINT(dx,dy), COLOR(0xFF00));
  47. }
  48. }
  49. }
  50. }
  51. void process(image_t* out, const image_t* in)
  52. {
  53. uint8_t tab[64*48]={0};
  54. //image_mem_copy(out, in);
  55. //sat(out, in,80);
  56. minimise(320,240,tab, out,in);
  57. /*draw_line(out, POINT(0,0), POINT(640,480), COLOR(0xFF0000));
  58. draw_line(out, POINT(0,479), POINT(640,-480), COLOR(0xFF0000));
  59. fill_circle(out, POINT(300,300), 70, COLOR(0xFF0000));*/
  60. int i,j;
  61. int xmin=out->w, ymin=out->h, xmax=0, ymax=0;
  62. int ya=0,xa=0,xb=0,yb=9;
  63. for(i=0; i<out->w; i++)
  64. {
  65. for(j=0; j<out->h; j++)
  66. {
  67. int g = IMG_GET_G(out, i, j);
  68. int r = IMG_GET_R(out, i, j);
  69. int b = IMG_GET_B(out, i, j);
  70. if(g==255 && !r && !b)
  71. {
  72. if(i>xmax) {xmax=i; ya=j;}
  73. if(j>ymax) {ymax=j; xa=i;}
  74. if(i<xmin) {xmin=i; yb=j;}
  75. if(j<ymin) {ymin=j; xb=i;}
  76. }
  77. }
  78. }
  79. //draw_rect(out, POINT(xmin, ymin), POINT(xmax-xmin,ymax-ymin), COLOR(0xff0000));
  80. draw_line(out, POINT(xmax,ya), POINT(xa-xmax, ymax-ya), COLOR(0xffffff));
  81. printf("%d,%d -> %d,%d\n", xmax,ya, xa, ymax);
  82. draw_line(out, POINT(xa, ymax), POINT(xmin-xa, yb-ymax), COLOR(0));
  83. draw_line(out, POINT(xmin, yb), POINT(xb-xmin,ymin-yb), COLOR(0));
  84. draw_line(out, POINT(xb,ymin),POINT(xmax-xb,ya-ymin), COLOR(0));
  85. draw_circle(out, POINT(xmax,ya), 5, COLOR(0xFF0000));
  86. draw_circle(out, POINT(xmin,yb), 5, COLOR(0xFF0000));
  87. draw_circle(out, POINT(xa,ymin), 5, COLOR(0xFF0000));
  88. draw_circle(out, POINT(xb,ymax), 5, COLOR(0xFF0000));
  89. }