Thresholding on Red using the C328 camera based on Shinichiro Nakamura\'s c328 driver. Copyright (C) 2010 Devesh Rai

Dependencies:   CameraC328 mbed

Committer:
devesh_rai
Date:
Mon Feb 21 17:57:33 2011 +0000
Revision:
0:f02bc8c01d78

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
devesh_rai 0:f02bc8c01d78 1 /**
devesh_rai 0:f02bc8c01d78 2 * Thresholding on Red using the C328 camera
devesh_rai 0:f02bc8c01d78 3 * based on Shinichiro Nakamura's c328 driver.
devesh_rai 0:f02bc8c01d78 4 * Copyright (C) 2010 Devesh Rai
devesh_rai 0:f02bc8c01d78 5 *
devesh_rai 0:f02bc8c01d78 6 *
devesh_rai 0:f02bc8c01d78 7 * Original copyright notice
devesh_rai 0:f02bc8c01d78 8 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
devesh_rai 0:f02bc8c01d78 9 * http://shinta.main.jp/
devesh_rai 0:f02bc8c01d78 10 */
devesh_rai 0:f02bc8c01d78 11
devesh_rai 0:f02bc8c01d78 12 #include "mbed.h"
devesh_rai 0:f02bc8c01d78 13 #include "CameraC328.h"
devesh_rai 0:f02bc8c01d78 14 #include "MobileLCD.h"
devesh_rai 0:f02bc8c01d78 15
devesh_rai 0:f02bc8c01d78 16 Serial serial(USBTX, USBRX);
devesh_rai 0:f02bc8c01d78 17
devesh_rai 0:f02bc8c01d78 18 MobileLCD lcd(p5, p6, p7, p8, p9);
devesh_rai 0:f02bc8c01d78 19 int x,y;
devesh_rai 0:f02bc8c01d78 20
devesh_rai 0:f02bc8c01d78 21 LocalFileSystem fs ("fs");
devesh_rai 0:f02bc8c01d78 22
devesh_rai 0:f02bc8c01d78 23 CameraC328 camera(p9, p10, CameraC328::Baud19200);
devesh_rai 0:f02bc8c01d78 24 const int IMG_X = 80;
devesh_rai 0:f02bc8c01d78 25 const int IMG_Y = 60;
devesh_rai 0:f02bc8c01d78 26 char buf[IMG_X * IMG_Y * 2];
devesh_rai 0:f02bc8c01d78 27 FILE *fp_jpeg;
devesh_rai 0:f02bc8c01d78 28
devesh_rai 0:f02bc8c01d78 29 void uncompressed_callback(size_t done, size_t total, char c) {
devesh_rai 0:f02bc8c01d78 30 buf[done - 1] = c;
devesh_rai 0:f02bc8c01d78 31 }
devesh_rai 0:f02bc8c01d78 32
devesh_rai 0:f02bc8c01d78 33 void jpeg_callback(char *buf, size_t siz) {
devesh_rai 0:f02bc8c01d78 34 for (int i = 0; i < (int)siz; i++) {
devesh_rai 0:f02bc8c01d78 35 fprintf(fp_jpeg, "%c", buf[i]);
devesh_rai 0:f02bc8c01d78 36 }
devesh_rai 0:f02bc8c01d78 37 }
devesh_rai 0:f02bc8c01d78 38
devesh_rai 0:f02bc8c01d78 39 void sync(void) {
devesh_rai 0:f02bc8c01d78 40 CameraC328::ErrorNumber err = CameraC328::NoError;
devesh_rai 0:f02bc8c01d78 41
devesh_rai 0:f02bc8c01d78 42 err = camera.sync();
devesh_rai 0:f02bc8c01d78 43 if (CameraC328::NoError == err) {
devesh_rai 0:f02bc8c01d78 44 printf("[ OK ] : CameraC328::sync\n");
devesh_rai 0:f02bc8c01d78 45 } else {
devesh_rai 0:f02bc8c01d78 46 printf("[FAIL] : CameraC328::sync (Error=%02X)\n", (int)err);
devesh_rai 0:f02bc8c01d78 47 }
devesh_rai 0:f02bc8c01d78 48 }
devesh_rai 0:f02bc8c01d78 49
devesh_rai 0:f02bc8c01d78 50 void test_uncompressed_snapshot_picture(void) {
devesh_rai 0:f02bc8c01d78 51 CameraC328::ErrorNumber err = CameraC328::NoError;
devesh_rai 0:f02bc8c01d78 52
devesh_rai 0:f02bc8c01d78 53 err = camera.init(CameraC328::Color16bit, CameraC328::RawResolution80x60, CameraC328::JpegResolution80x64);
devesh_rai 0:f02bc8c01d78 54 if (CameraC328::NoError == err) {
devesh_rai 0:f02bc8c01d78 55 printf("[ OK ] : CameraC328::init\n");
devesh_rai 0:f02bc8c01d78 56 } else {
devesh_rai 0:f02bc8c01d78 57 printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
devesh_rai 0:f02bc8c01d78 58 }
devesh_rai 0:f02bc8c01d78 59
devesh_rai 0:f02bc8c01d78 60 for (int i = 0; i < 10; i++) {
devesh_rai 0:f02bc8c01d78 61 err = camera.getUncompressedSnapshotPicture(uncompressed_callback);
devesh_rai 0:f02bc8c01d78 62 if (CameraC328::NoError == err) {
devesh_rai 0:f02bc8c01d78 63 printf("[ OK ] : CameraC328::getUncompressedSnapshotPicture\n");
devesh_rai 0:f02bc8c01d78 64 } else {
devesh_rai 0:f02bc8c01d78 65 printf("[FAIL] : CameraC328::getUncompressedSnapshotPicture (Error=%02X)\n", (int)err);
devesh_rai 0:f02bc8c01d78 66 }
devesh_rai 0:f02bc8c01d78 67
devesh_rai 0:f02bc8c01d78 68 char fname[64];
devesh_rai 0:f02bc8c01d78 69 snprintf(fname, sizeof(fname), "/fs/ucss%04d.ppm", i);
devesh_rai 0:f02bc8c01d78 70 FILE *fp = fopen(fname, "w");
devesh_rai 0:f02bc8c01d78 71 fprintf(fp, "P3\n");
devesh_rai 0:f02bc8c01d78 72 fprintf(fp, "%d %d\n", IMG_X, IMG_Y);
devesh_rai 0:f02bc8c01d78 73 fprintf(fp, "%d\n", 255);
devesh_rai 0:f02bc8c01d78 74 for (int y = 0; y < IMG_Y; y++) {
devesh_rai 0:f02bc8c01d78 75 for (int x = 0; x < IMG_X; x++) {
devesh_rai 0:f02bc8c01d78 76 int adrofs = y * (IMG_X * 2) + (x * 2);
devesh_rai 0:f02bc8c01d78 77 uint16_t dat = (buf[adrofs + 0] << 8) | (buf[adrofs + 1] << 0);
devesh_rai 0:f02bc8c01d78 78 uint8_t r = ((dat >> 11) & 0x1f) << 3;
devesh_rai 0:f02bc8c01d78 79 uint8_t g = ((dat >> 5) & 0x3f) << 2;
devesh_rai 0:f02bc8c01d78 80 uint8_t b = ((dat >> 0) & 0x1f) << 3;
devesh_rai 0:f02bc8c01d78 81 fprintf(fp,"%d %d %d\n", r, g, b);
devesh_rai 0:f02bc8c01d78 82 }
devesh_rai 0:f02bc8c01d78 83 }
devesh_rai 0:f02bc8c01d78 84 fclose(fp);
devesh_rai 0:f02bc8c01d78 85 }
devesh_rai 0:f02bc8c01d78 86 }
devesh_rai 0:f02bc8c01d78 87
devesh_rai 0:f02bc8c01d78 88 void test_uncompressed_preview_picture(void) {
devesh_rai 0:f02bc8c01d78 89 CameraC328::ErrorNumber err = CameraC328::NoError;
devesh_rai 0:f02bc8c01d78 90
devesh_rai 0:f02bc8c01d78 91 err = camera.init(CameraC328::Color16bit, CameraC328::RawResolution80x60, CameraC328::JpegResolution80x64);
devesh_rai 0:f02bc8c01d78 92 if (CameraC328::NoError == err) {
devesh_rai 0:f02bc8c01d78 93 printf("[ OK ] : CameraC328::init\n");
devesh_rai 0:f02bc8c01d78 94 } else {
devesh_rai 0:f02bc8c01d78 95 printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
devesh_rai 0:f02bc8c01d78 96 }
devesh_rai 0:f02bc8c01d78 97
devesh_rai 0:f02bc8c01d78 98 for (int i = 0; i < 10; i++) {
devesh_rai 0:f02bc8c01d78 99 err = camera.getUncompressedPreviewPicture(uncompressed_callback);
devesh_rai 0:f02bc8c01d78 100 if (CameraC328::NoError == err) {
devesh_rai 0:f02bc8c01d78 101 printf("[ OK ] : CameraC328::getUncompressedPreviewPicture\n");
devesh_rai 0:f02bc8c01d78 102 } else {
devesh_rai 0:f02bc8c01d78 103 printf("[FAIL] : CameraC328::getUncompressedPreviewPicture (Error=%02X)\n", (int)err);
devesh_rai 0:f02bc8c01d78 104 }
devesh_rai 0:f02bc8c01d78 105
devesh_rai 0:f02bc8c01d78 106 //char fname[64];
devesh_rai 0:f02bc8c01d78 107 //snprintf(fname, sizeof(fname), "/fs/ucpv%04d.ppm", i);
devesh_rai 0:f02bc8c01d78 108 //FILE *fp = fopen(fname, "w");
devesh_rai 0:f02bc8c01d78 109 //fprintf(fp, "P3\n");
devesh_rai 0:f02bc8c01d78 110 //fprintf(fp, "%d %d\n", IMG_X, IMG_Y);
devesh_rai 0:f02bc8c01d78 111 //fprintf(fp, "%d\n", 255);
devesh_rai 0:f02bc8c01d78 112 for (int y = 0; y < IMG_Y; y++) {
devesh_rai 0:f02bc8c01d78 113 for (int x = 0; x < IMG_X; x++) {
devesh_rai 0:f02bc8c01d78 114 int adrofs = y * (IMG_X * 2) + (x * 2);
devesh_rai 0:f02bc8c01d78 115 uint16_t dat = (buf[adrofs + 0] << 8) | (buf[adrofs + 1] << 0);
devesh_rai 0:f02bc8c01d78 116 uint8_t r = ((dat >> 11) & 0x1f) << 3;
devesh_rai 0:f02bc8c01d78 117 uint8_t g = ((dat >> 5) & 0x3f) << 2;
devesh_rai 0:f02bc8c01d78 118 uint8_t b = ((dat >> 0) & 0x1f) << 3;
devesh_rai 0:f02bc8c01d78 119 lcd.pixel(x,y,r);
devesh_rai 0:f02bc8c01d78 120 //fprintf(fp,"%d %d %d\n", r, g, b);
devesh_rai 0:f02bc8c01d78 121 }
devesh_rai 0:f02bc8c01d78 122 }
devesh_rai 0:f02bc8c01d78 123 //fclose(fp);
devesh_rai 0:f02bc8c01d78 124 }
devesh_rai 0:f02bc8c01d78 125 }
devesh_rai 0:f02bc8c01d78 126
devesh_rai 0:f02bc8c01d78 127 void test_jpeg_snapshot_picture(void) {
devesh_rai 0:f02bc8c01d78 128 CameraC328::ErrorNumber err = CameraC328::NoError;
devesh_rai 0:f02bc8c01d78 129
devesh_rai 0:f02bc8c01d78 130 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480);
devesh_rai 0:f02bc8c01d78 131 if (CameraC328::NoError == err) {
devesh_rai 0:f02bc8c01d78 132 printf("[ OK ] : CameraC328::init\n");
devesh_rai 0:f02bc8c01d78 133 } else {
devesh_rai 0:f02bc8c01d78 134 printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
devesh_rai 0:f02bc8c01d78 135 }
devesh_rai 0:f02bc8c01d78 136
devesh_rai 0:f02bc8c01d78 137 for (int i = 0; i < 10; i++) {
devesh_rai 0:f02bc8c01d78 138 char fname[64];
devesh_rai 0:f02bc8c01d78 139 snprintf(fname, sizeof(fname), "/fs/jpss%04d.jpg", i);
devesh_rai 0:f02bc8c01d78 140 fp_jpeg = fopen(fname, "w");
devesh_rai 0:f02bc8c01d78 141
devesh_rai 0:f02bc8c01d78 142 err = camera.getJpegSnapshotPicture(jpeg_callback);
devesh_rai 0:f02bc8c01d78 143 if (CameraC328::NoError == err) {
devesh_rai 0:f02bc8c01d78 144 printf("[ OK ] : CameraC328::getJpegSnapshotPicture\n");
devesh_rai 0:f02bc8c01d78 145 } else {
devesh_rai 0:f02bc8c01d78 146 printf("[FAIL] : CameraC328::getJpegSnapshotPicture (Error=%02X)\n", (int)err);
devesh_rai 0:f02bc8c01d78 147 }
devesh_rai 0:f02bc8c01d78 148
devesh_rai 0:f02bc8c01d78 149 fclose(fp_jpeg);
devesh_rai 0:f02bc8c01d78 150 }
devesh_rai 0:f02bc8c01d78 151 }
devesh_rai 0:f02bc8c01d78 152
devesh_rai 0:f02bc8c01d78 153 void test_jpeg_preview_picture(void) {
devesh_rai 0:f02bc8c01d78 154 CameraC328::ErrorNumber err = CameraC328::NoError;
devesh_rai 0:f02bc8c01d78 155
devesh_rai 0:f02bc8c01d78 156 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480);
devesh_rai 0:f02bc8c01d78 157 if (CameraC328::NoError == err) {
devesh_rai 0:f02bc8c01d78 158 printf("[ OK ] : CameraC328::init\n");
devesh_rai 0:f02bc8c01d78 159 } else {
devesh_rai 0:f02bc8c01d78 160 printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
devesh_rai 0:f02bc8c01d78 161 }
devesh_rai 0:f02bc8c01d78 162
devesh_rai 0:f02bc8c01d78 163 for (int i = 0; i < 10; i++) {
devesh_rai 0:f02bc8c01d78 164 char fname[64];
devesh_rai 0:f02bc8c01d78 165 snprintf(fname, sizeof(fname), "/fs/jppv%04d.jpg", i);
devesh_rai 0:f02bc8c01d78 166 fp_jpeg = fopen(fname, "w");
devesh_rai 0:f02bc8c01d78 167
devesh_rai 0:f02bc8c01d78 168 err = camera.getJpegPreviewPicture(jpeg_callback);
devesh_rai 0:f02bc8c01d78 169 if (CameraC328::NoError == err) {
devesh_rai 0:f02bc8c01d78 170 printf("[ OK ] : CameraC328::getJpegPreviewPicture\n");
devesh_rai 0:f02bc8c01d78 171 } else {
devesh_rai 0:f02bc8c01d78 172 printf("[FAIL] : CameraC328::getJpegPreviewPicture (Error=%02X)\n", (int)err);
devesh_rai 0:f02bc8c01d78 173 }
devesh_rai 0:f02bc8c01d78 174
devesh_rai 0:f02bc8c01d78 175 fclose(fp_jpeg);
devesh_rai 0:f02bc8c01d78 176 }
devesh_rai 0:f02bc8c01d78 177 }
devesh_rai 0:f02bc8c01d78 178
devesh_rai 0:f02bc8c01d78 179 int main() {
devesh_rai 0:f02bc8c01d78 180 serial.baud(19200);
devesh_rai 0:f02bc8c01d78 181 serial.printf("\n");
devesh_rai 0:f02bc8c01d78 182 serial.printf("==========\n");
devesh_rai 0:f02bc8c01d78 183 serial.printf("CameraC328\n");
devesh_rai 0:f02bc8c01d78 184 serial.printf("==========\n");
devesh_rai 0:f02bc8c01d78 185 //lcd.
devesh_rai 0:f02bc8c01d78 186 lcd.background(0x000000);
devesh_rai 0:f02bc8c01d78 187 lcd.cls();
devesh_rai 0:f02bc8c01d78 188 for(x=0;x<80;x++)
devesh_rai 0:f02bc8c01d78 189 for(y=0;y<60;y++)
devesh_rai 0:f02bc8c01d78 190 lcd.pixel(x,y,0x0000ff);
devesh_rai 0:f02bc8c01d78 191 lcd.locate(2,3);
devesh_rai 0:f02bc8c01d78 192 lcd.printf("Camera");
devesh_rai 0:f02bc8c01d78 193 lcd.locate(0,9);
devesh_rai 0:f02bc8c01d78 194 lcd.printf("Tracking: Circle");
devesh_rai 0:f02bc8c01d78 195 lcd.locate(10,2);
devesh_rai 0:f02bc8c01d78 196 lcd.printf("X: 0.0");
devesh_rai 0:f02bc8c01d78 197 lcd.locate(10,3);
devesh_rai 0:f02bc8c01d78 198 lcd.printf("Y: 0.0");
devesh_rai 0:f02bc8c01d78 199 lcd.locate(0,13);
devesh_rai 0:f02bc8c01d78 200 sync();
devesh_rai 0:f02bc8c01d78 201 // test_uncompressed_snapshot_picture();
devesh_rai 0:f02bc8c01d78 202 test_uncompressed_preview_picture();
devesh_rai 0:f02bc8c01d78 203 //test_jpeg_preview_picture();
devesh_rai 0:f02bc8c01d78 204 //test_jpeg_snapshot_picture();
devesh_rai 0:f02bc8c01d78 205
devesh_rai 0:f02bc8c01d78 206 return 0;
devesh_rai 0:f02bc8c01d78 207 }