static bool frameToImage(tPvFrame* frame, sensor_msgs::Image &image) { // NOTE: 16-bit and Yuv formats not supported static const char* BAYER_ENCODINGS[] = { "bayer_rggb8", "bayer_gbrg8", "bayer_grbg8", "bayer_bggr8" }; std::string encoding; if (frame->Format == ePvFmtMono8) encoding = sensor_msgs::image_encodings::MONO8; else if (frame->Format == ePvFmtBayer8) { #if 1 encoding = BAYER_ENCODINGS[frame->BayerPattern]; #else image.encoding = sensor_msgs::image_encodings::BGR8; image.height = frame->Height; image.width = frame->Width; image.step = frame->Width * 3; image.data.resize(frame->Height * (frame->Width * 3)); PvUtilityColorInterpolate(frame, &image.data[2], &image.data[1], &image.data[0], 2, 0); return true; #endif } else if (frame->Format == ePvFmtRgb24) encoding = sensor_msgs::image_encodings::RGB8; else if (frame->Format == ePvFmtBgr24) encoding = sensor_msgs::image_encodings::BGR8; else if (frame->Format == ePvFmtRgba32) encoding = sensor_msgs::image_encodings::RGBA8; else if (frame->Format == ePvFmtBgra32) encoding = sensor_msgs::image_encodings::BGRA8; else { ROS_WARN("Received frame with unsupported pixel format %d", frame->Format); return false; } uint32_t step = frame->ImageSize / frame->Height; return sensor_msgs::fillImage(image, encoding, frame->Height, frame->Width, step, frame->ImageBuffer); }
void OmniCamera::grab(IplImage *img) { //Sleep(400); PvCaptureQueueFrame(_camera.handle,&(_camera.frame),0); //printf("waiting for the frame ...\n"); PvCaptureWaitForFrameDone(_camera.handle,&(_camera.frame),PVINFINITE); //printf("frame's done ...\n, width %d height %d depth %d size %d\n",_camera.frame.Width,_camera.frame.Height,_camera.frame.BitDepth, _camera.frame.ImageBufferSize); PvUtilityColorInterpolate(&_camera.frame,&img->imageData[2],&img->imageData[1],&img->imageData[0],2,0); }