bool retrieveFrame(int channel, cv::OutputArray outArray) { CLEyeCameraGetFrame(m_eye, pCapBuffer, 33); const int from_to[] = { 0, 0, 1, 1, 2, 2 }; const CvArr** src = (const CvArr**)&m_frame4ch; CvArr** dst = (CvArr**)&m_frame; cvMixChannels(src, 1, dst, 1, from_to, 3); if (m_frame->origin == IPL_ORIGIN_TL) cv::cvarrToMat(m_frame).copyTo(outArray); else { cv::Mat temp = cv::cvarrToMat(m_frame); flip(temp, outArray, 0); } return true; }
IplImage * camera_control_query_frame(CameraControl* cc) { 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; #else long start = psmove_util_get_ticks(); result = cvQueryFrame(cc->capture); psmove_DEBUG("cvQueryFrame: %ld ms\n", psmove_util_get_ticks() - start); #endif #if defined(PSMOVE_USE_DEINTERLACE) /** * 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); #endif // 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; } return result; }
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; }