BaseJpegDeocde exampe program
Dependencies: BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos
Fork of BaseJpegDecode by
example1_c270.cpp@3:2709bbf8baae, 2012-10-25 (annotated)
- 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?
User | Revision | Line number | New 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 |