BaseJpegDeocde exampe program

Dependencies:   BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos

Fork of BaseJpegDecode by Norimasa Okamoto

Committer:
va009039
Date:
Thu Oct 25 11:02:17 2012 +0000
Revision:
3:2709bbf8baae
Parent:
2:697ebeb8336f
Child:
4:7d88de31c55a
support DQT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 3:2709bbf8baae 1 #if 0
va009039 2:697ebeb8336f 2 //
va009039 2:697ebeb8336f 3 // simple color tracking
va009039 2:697ebeb8336f 4 //
va009039 0:7121d9fb45f4 5 #include "mbed.h"
va009039 0:7121d9fb45f4 6 #include "BaseJpegDecode.h"
va009039 0:7121d9fb45f4 7 #include "uvc.h"
va009039 2:697ebeb8336f 8 #include "Terminal.h"
va009039 0:7121d9fb45f4 9
va009039 0:7121d9fb45f4 10 // Logitech C270
va009039 0:7121d9fb45f4 11 #define WIDTH 320
va009039 3:2709bbf8baae 12 #define HEIGHT 240
va009039 3:2709bbf8baae 13
va009039 3:2709bbf8baae 14 #define THRESHOLD 100
va009039 0:7121d9fb45f4 15
va009039 0:7121d9fb45f4 16 #define ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
va009039 0:7121d9fb45f4 17
va009039 0:7121d9fb45f4 18 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
va009039 2:697ebeb8336f 19 Terminal term(USBTX, USBRX);
va009039 0:7121d9fb45f4 20
va009039 0:7121d9fb45f4 21 class CalcCenter : public BaseJpegDecode {
va009039 0:7121d9fb45f4 22 public:
va009039 0:7121d9fb45f4 23 int y_center, x_center;
va009039 0:7121d9fb45f4 24 int m_x_sum, m_y_sum, m_sum;
va009039 3:2709bbf8baae 25 int16_t m_buf[WIDTH/16*HEIGHT/8];
va009039 0:7121d9fb45f4 26 virtual void outputDC(int mcu, int block, int value) {
va009039 0:7121d9fb45f4 27 if (mcu >= (WIDTH/16*HEIGHT/8)) {
va009039 0:7121d9fb45f4 28 return;
va009039 0:7121d9fb45f4 29 }
va009039 0:7121d9fb45f4 30 if (block == 3) { // 0-1:Y 2:Cb 3:Cr
va009039 3:2709bbf8baae 31 value *= qt[1][0];
va009039 3:2709bbf8baae 32 ASSERT(value < 32367 && value > -32368);
va009039 0:7121d9fb45f4 33 m_buf[mcu] = value; // debug
va009039 3:2709bbf8baae 34 if (value >= THRESHOLD) { // red
va009039 0:7121d9fb45f4 35 m_x_sum += value*(mcu%(WIDTH/16));
va009039 0:7121d9fb45f4 36 m_y_sum += value*(mcu/(WIDTH/16));
va009039 0:7121d9fb45f4 37 m_sum += value;
va009039 0:7121d9fb45f4 38 }
va009039 0:7121d9fb45f4 39 }
va009039 0:7121d9fb45f4 40 }
va009039 0:7121d9fb45f4 41 virtual void outputAC(int mcu, int block, int scan, int value){};
va009039 0:7121d9fb45f4 42 virtual void outputMARK(uint8_t c){
va009039 0:7121d9fb45f4 43 if (c == 0xd9) { // EOI
va009039 0:7121d9fb45f4 44 if(m_sum == 0) {
va009039 0:7121d9fb45f4 45 x_center = y_center = -1; // not found
va009039 0:7121d9fb45f4 46 } else {
va009039 0:7121d9fb45f4 47 x_center = m_x_sum / m_sum;
va009039 0:7121d9fb45f4 48 y_center = m_y_sum / m_sum;
va009039 0:7121d9fb45f4 49 }
va009039 0:7121d9fb45f4 50 m_x_sum = m_y_sum = m_sum = 0; // reset
va009039 0:7121d9fb45f4 51 led2 = !led2;
va009039 0:7121d9fb45f4 52 }
va009039 0:7121d9fb45f4 53 };
va009039 0:7121d9fb45f4 54 };
va009039 0:7121d9fb45f4 55
va009039 0:7121d9fb45f4 56 CalcCenter* calc = NULL;
va009039 0:7121d9fb45f4 57
va009039 0:7121d9fb45f4 58 void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len)
va009039 0:7121d9fb45f4 59 {
va009039 0:7121d9fb45f4 60 if (calc) {
va009039 0:7121d9fb45f4 61 calc->input(buf+12, len-12);
va009039 0:7121d9fb45f4 62 }
va009039 0:7121d9fb45f4 63 led1 = buf[1]&1; // FID
va009039 0:7121d9fb45f4 64 }
va009039 0:7121d9fb45f4 65
va009039 0:7121d9fb45f4 66 int main() {
va009039 2:697ebeb8336f 67 term.baud(921600);
va009039 2:697ebeb8336f 68 term.printf("%s\n", __FILE__);
va009039 0:7121d9fb45f4 69
va009039 0:7121d9fb45f4 70 calc = new CalcCenter;
va009039 0:7121d9fb45f4 71 ASSERT(calc);
va009039 0:7121d9fb45f4 72 uvc* cam = new uvc;
va009039 0:7121d9fb45f4 73 ASSERT(cam);
va009039 0:7121d9fb45f4 74 cam->SetImageSize(WIDTH, HEIGHT);
va009039 0:7121d9fb45f4 75 cam->SetFrameInterval(2000000); // 5.0fps
va009039 0:7121d9fb45f4 76 cam->setOnResult(callback_motion_jpeg);
va009039 0:7121d9fb45f4 77 ASSERT(cam->setup() >= 0);
va009039 2:697ebeb8336f 78 term.cls();
va009039 2:697ebeb8336f 79 int fg, old_fg = 0xffffff;
va009039 0:7121d9fb45f4 80 while(1) {
va009039 2:697ebeb8336f 81 int y;
va009039 2:697ebeb8336f 82 for(y = 0; y < HEIGHT/8; y++) {
va009039 2:697ebeb8336f 83 term.locate(0, y);
va009039 0:7121d9fb45f4 84 for(int x = 0; x < WIDTH/16; x++) {
va009039 2:697ebeb8336f 85 int value = calc->m_buf[y*WIDTH/16+x];
va009039 3:2709bbf8baae 86 if (value >= THRESHOLD) {
va009039 2:697ebeb8336f 87 fg = 0xff0000; // red
va009039 2:697ebeb8336f 88 } else {
va009039 2:697ebeb8336f 89 fg = 0xffffff; // white
va009039 2:697ebeb8336f 90 }
va009039 2:697ebeb8336f 91 if (fg != old_fg) {
va009039 2:697ebeb8336f 92 term.foreground(fg);
va009039 2:697ebeb8336f 93 old_fg = fg;
va009039 2:697ebeb8336f 94 }
va009039 3:2709bbf8baae 95 term.printf("%+4d,", value);
va009039 0:7121d9fb45f4 96 cam->poll();
va009039 0:7121d9fb45f4 97 }
va009039 0:7121d9fb45f4 98 }
va009039 2:697ebeb8336f 99 term.locate(0, y);
va009039 2:697ebeb8336f 100 term.printf("Cr:(%d,%d)", calc->x_center, calc->y_center);
va009039 0:7121d9fb45f4 101 cam->wait_ms(500);
va009039 0:7121d9fb45f4 102 led3 = !led3;
va009039 0:7121d9fb45f4 103 }
va009039 0:7121d9fb45f4 104 }
va009039 0:7121d9fb45f4 105 #endif