CameraControl * camera_control_new_with_settings(int cameraID, int width, int height, int framerate, int cam_type) { CameraControl* cc = (CameraControl*) calloc(1, sizeof(CameraControl)); cc->cameraID = cameraID; if (framerate <= 0) { framerate = PSMOVE_TRACKER_DEFAULT_FPS; } if (cam_type == PSMove_Camera_PS3EYE_BLUEDOT) { cc->focl_x = (float)PS3EYE_FOCAL_LENGTH_BLUE; cc->focl_y = (float)PS3EYE_FOCAL_LENGTH_BLUE; } else if (cam_type == PSMove_Camera_PS3EYE_REDDOT) { cc->focl_x = (float)PS3EYE_FOCAL_LENGTH_RED; cc->focl_y = (float)PS3EYE_FOCAL_LENGTH_RED; } else if (cam_type == PSMove_Camera_Unknown) { cc->focl_x = (float)PS3EYE_FOCAL_LENGTH_BLUE; cc->focl_y = (float)PS3EYE_FOCAL_LENGTH_BLUE; } // Needed for cbb tracker. Will be overwritten by camera calibration files if they exist. #if defined(CAMERA_CONTROL_USE_CL_DRIVER) // Windows 32-bit. Either CL_SDK or Registry_requiring int cams = CLEyeGetCameraCount(); if (cams <= cameraID) { free(cc); return NULL; } GUID cguid = CLEyeGetCameraUUID(cameraID); cc->camera = CLEyeCreateCamera(cguid, CLEYE_COLOR_PROCESSED, CLEYE_VGA, framerate); CLEyeCameraGetFrameDimensions(cc->camera, &width, &height); // Depending on color mode chosen, create the appropriate OpenCV image cc->frame4ch = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 4); cc->frame3ch = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); CLEyeCameraStart(cc->camera); #elif defined(CAMERA_CONTROL_USE_PS3EYE_DRIVER) // Mac or Windows // Initialize PS3EYEDriver ps3eye_init(); int cams = ps3eye_count_connected(); psmove_DEBUG("Found %i ps3eye(s) with CAMERA_CONTROL_USE_PS3EYE_DRIVER.\n", cams); if (cams <= cameraID) { free(cc); return NULL; } if (width <= 0 || height <= 0) { get_metrics(&width, &height); } psmove_DEBUG("Attempting to open ps3eye with cameraId, width, height, framerate: %d, %d, %d, %d.\n", cameraID, width, height, framerate); cc->eye = ps3eye_open(cameraID, width, height, framerate); if (cc->eye == NULL) { psmove_WARNING("Failed to open camera ID %d", cameraID); free(cc); return NULL; } cc->framebgr = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); #else // Assume webcam accessible from OpenCV. char *video = psmove_util_get_env_string(PSMOVE_TRACKER_FILENAME_ENV); if (video) { psmove_DEBUG("Using '%s' as video input.\n", video); cc->capture = cvCaptureFromFile(video); free(video); } else { cc->capture = cvCaptureFromCAM(cc->cameraID); if (width <= 0 || height <= 0) { get_metrics(&width, &height); } cvSetCaptureProperty(cc->capture, CV_CAP_PROP_FRAME_WIDTH, width); cvSetCaptureProperty(cc->capture, CV_CAP_PROP_FRAME_HEIGHT, height); } #endif cc->width = width; cc->height = height; cc->deinterlace = PSMove_False; return cc; }
int main(int argc, char *argv[]) { ps3eye_context ctx(640, 480, 30); if (!ctx.hasDevices()) { printf("No PS3 Eye camera connected\n"); return EXIT_FAILURE; } if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("Failed to initialize SDL: %s\n", SDL_GetError()); return EXIT_FAILURE; } SDL_Window *window = SDL_CreateWindow( "PS3 Eye - SDL 2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0); if (window == NULL) { printf("Failed to create window: %s\n", SDL_GetError()); return EXIT_FAILURE; } SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC); if (renderer == NULL) { printf("Failed to create renderer: %s\n", SDL_GetError()); SDL_DestroyWindow(window); return EXIT_FAILURE; } SDL_RenderSetLogicalSize(renderer, ctx.frame_width, ctx.frame_height); print_renderer_info(renderer); SDL_Texture *video_tex = SDL_CreateTexture( renderer, SDL_PIXELFORMAT_YUY2, SDL_TEXTUREACCESS_STREAMING, ctx.frame_width, ctx.frame_height); if (video_tex == NULL) { printf("Failed to create video texture: %s\n", SDL_GetError()); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); return EXIT_FAILURE; } ctx.eye = ps3eye_open(0, ctx.frame_width, ctx.frame_height, ctx.frame_rate); if (ctx.eye == NULL) { printf("Failed to initialize camera: %s\n"); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); return EXIT_FAILURE; } ps3eye_set_flip(ctx.eye, true, false); printf("Camera mode: %dx%d@%d\n", ctx.frame_width, ctx.frame_height, ctx.frame_rate); SDL_Event e; void *video_tex_pixels; int pitch; while (ctx.running) { while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { ctx.running = false; } } // TODO: Proper thread signalling to wait for next available buffer SDL_Delay(10); int row_bytes = 0; uint8_t *frame_data = ps3eye_grab_frame(ctx.eye, &row_bytes); int frame_data_size = row_bytes * ctx.frame_height; if (frame_data != NULL) { SDL_LockTexture(video_tex, NULL, &video_tex_pixels, &pitch); memcpy(video_tex_pixels, frame_data, frame_data_size); SDL_UnlockTexture(video_tex); } SDL_RenderCopy(renderer, video_tex, NULL, NULL); SDL_RenderPresent(renderer); } ps3eye_close(ctx.eye); SDL_DestroyTexture(video_tex); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); return EXIT_SUCCESS; }
CameraControl * camera_control_new(int cameraID) { CameraControl* cc = (CameraControl*) calloc(1, sizeof(CameraControl)); cc->cameraID = cameraID; #if defined(CAMERA_CONTROL_USE_CL_DRIVER) int w, h; int cams = CLEyeGetCameraCount(); if (cams <= cameraID) { free(cc); return NULL; } GUID cguid = CLEyeGetCameraUUID(cameraID); cc->camera = CLEyeCreateCamera(cguid, CLEYE_COLOR_PROCESSED, CLEYE_VGA, 60); CLEyeCameraGetFrameDimensions(cc->camera, &w, &h); // Depending on color mode chosen, create the appropriate OpenCV image cc->frame4ch = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 4); cc->frame3ch = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 3); CLEyeCameraStart(cc->camera); #elif defined(CAMERA_CONTROL_USE_PS3EYE_DRIVER) ps3eye_init(); int cams = ps3eye_count_connected(); if (cams <= cameraID) { free(cc); return NULL; } get_metrics(&(cc->width), &(cc->height)); cc->eye = ps3eye_open(cameraID, cc->width, cc->height, 60); cc->framebgr = cvCreateImage(cvSize(cc->width, cc->height), IPL_DEPTH_8U, 3); #else char *video = psmove_util_get_env_string(PSMOVE_TRACKER_FILENAME_ENV); if (video) { psmove_DEBUG("Using '%s' as video input.\n", video); cc->capture = cvCaptureFromFile(video); free(video); } else { cc->capture = cvCaptureFromCAM(cc->cameraID); int width, height; get_metrics(&width, &height); cvSetCaptureProperty(cc->capture, CV_CAP_PROP_FRAME_WIDTH, width); cvSetCaptureProperty(cc->capture, CV_CAP_PROP_FRAME_HEIGHT, height); } #endif cc->deinterlace = PSMove_False; return cc; }