void Image_Handler(FCGIContext * context, char * params) { int num = 0, width = 800, height = 600; FCGIValue val[] = { {"num", &num, FCGI_INT_T}, {"width", &width, FCGI_INT_T}, {"height", &height, FCGI_INT_T} }; if (!FCGI_ParseRequest(context, params, val, 3)) return; else if (num < 0 || num > 1) { FCGI_RejectJSON(context, "Invalid capture number"); return; } else if (width <= 0 || height <= 0) { FCGI_RejectJSON(context, "Invalid width/height"); return; } if (captureID != num) { if (captureID >= 0) { cvReleaseCapture(&capture); } capture = cvCreateCameraCapture(num); captureID = num; } cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height); static int p[] = {CV_IMWRITE_JPEG_QUALITY, 100, 0}; IplImage * frame = cvQueryFrame(capture); assert(frame != NULL); // CvMat stub; // CvMat * background = cvGetMat(frame, &stub, 0, 0); // CvMat *cv8u = cvCreateMat(frame->width, frame->height, CV_8U); // double min, max; // CvPoint a,b; // cvMinMaxLoc(background, &min, &max, &a, &b, 0); // double ccscale = 255.0/(max-min); // double ccshift = -min; //cvCvtScale(frame, cv8u, ccscale, ccshift); CvMat * jpg = cvEncodeImage(".jpg", frame, p); // Will this work? Log(LOGNOTE, "Sending image!"); FCGI_PrintRaw("Content-type: image/jpg\r\n"); FCGI_PrintRaw("Cache-Control: no-cache, no-store, must-revalidate\r\n\r\n"); //FCGI_PrintRaw("Content-Length: %d", jpg->rows*jpg->cols); FCGI_WriteBinary(jpg->data.ptr,1,jpg->rows*jpg->cols); cvReleaseMat(&jpg); cvReleaseImageHeader(&frame); }
/** * Helper: Begin Actuator response in a given format * @param context - the FCGIContext * @param format - Format * @param id - ID of Actuator */ void Actuator_BeginResponse(FCGIContext * context, Actuator * a, DataFormat format) { // Begin response switch (format) { case JSON: FCGI_BeginJSON(context, STATUS_OK); FCGI_JSONLong("id", a->id); FCGI_JSONLong("user_id", a->user_id); //TODO: Don't need to show this? FCGI_JSONPair("name", a->name); break; default: FCGI_PrintRaw("Content-type: text/plain\r\n\r\n"); break; } }
/** * Helper: Begin sensor response in a given format * @param context - the FCGIContext * @param id - ID of sensor * @param format - Format */ void Sensor_BeginResponse(FCGIContext * context, Sensor * s, DataFormat format) { // Begin response switch (format) { case JSON: FCGI_BeginJSON(context, STATUS_OK); FCGI_JSONLong("id", s->id); FCGI_JSONLong("user_id", s->user_id); //NOTE: Might not want to expose this? FCGI_JSONPair("name", s->name); break; default: FCGI_PrintRaw("Content-type: text/plain\r\n\r\n"); break; } }