BaseJpegDeocde exampe program

Dependencies:   BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos

Fork of BaseJpegDecode by Norimasa Okamoto

Committer:
va009039
Date:
Mon Oct 22 14:10:04 2012 +0000
Revision:
2:697ebeb8336f
Parent:
0:7121d9fb45f4
Child:
3:2709bbf8baae
use Terminal

Who changed what in which revision?

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