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; }
IplImage * camera_control_query_frame(CameraControl* cc, PSMove_timestamp *ts_grab, PSMove_timestamp *ts_retrieve) { IplImage* result; #if defined(CAMERA_CONTROL_USE_CL_DRIVER) // assign buffer-pointer to address of buffer cvGetRawData(cc->frame4ch, &cc->pCapBuffer, 0, 0); CLEyeCameraGetFrame(cc->camera, cc->pCapBuffer, 2000); // convert 4ch image to 3ch image const int from_to[] = { 0, 0, 1, 1, 2, 2 }; const CvArr** src = (const CvArr**) &cc->frame4ch; CvArr** dst = (CvArr**) &cc->frame3ch; cvMixChannels(src, 1, dst, 1, from_to, 3); result = cc->frame3ch; #elif defined(CAMERA_CONTROL_USE_PS3EYE_DRIVER) int stride = 0; unsigned char *pixels = ps3eye_grab_frame(cc->eye, &stride); // Convert pixels from camera to BGR unsigned char *cvpixels; cvGetRawData(cc->framebgr, &cvpixels, 0, 0); yuv422_to_bgr(pixels, stride, cvpixels, cc->width, cc->height); result = cc->framebgr; #else cvGrabFrame(cc->capture); if (ts_grab != NULL) { *ts_grab = _psmove_timestamp(); } result = cvRetrieveFrame(cc->capture, 0); if (ts_retrieve != NULL) { *ts_retrieve = _psmove_timestamp(); } #endif if (cc->deinterlace == PSMove_True) { /** * Dirty hack follows: * - Clone image * - Hack internal variables to make an image of all odd lines **/ IplImage *tmp = cvCloneImage(result); tmp->imageData += tmp->widthStep; // odd lines tmp->widthStep *= 2; tmp->height /= 2; /** * Use nearest-neighbor to be faster. In my tests, this does not * cause a speed disadvantage, and tracking quality is still good. * * This will scale the half-height image "tmp" to the original frame * size by doubling lines (so we can still do normal circle tracking). **/ cvResize(tmp, result, CV_INTER_NN); /** * Need to revert changes in tmp from above, otherwise the call * to cvReleaseImage would cause a crash. **/ tmp->height = result->height; tmp->widthStep = result->widthStep; tmp->imageData -= tmp->widthStep; // odd lines cvReleaseImage(&tmp); } // undistort image if (cc->mapx && cc->mapy) { cvRemap(result, cc->frame3chUndistort, cc->mapx, cc->mapy, CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS, cvScalarAll(0)); result = cc->frame3chUndistort; } #if defined(CAMERA_CONTROL_DEBUG_CAPTURED_IMAGE) cvShowImage("camera input", result); cvWaitKey(1); #endif return result; }