- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi there!
Can someone tell me how I can get the realsense imagedata into a cv::Mat?
I found some stuff in the forum,but I was confused with the planes/pitches.Any links/sample code for conversion from realsense to mat formats?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It depends on what type of data you want to get, and in what format.
For example, to get a color image, you could do something like this: (it can be done more efficiently, and you should error check on each step, but this should be easy to understand)
Let's say you have a color image:
PXCImage *color
You can create a cv::Mat color image based on it:
//First, create an ImageData object: PXCImage::ImageData * data = new PXCImage::ImageData; //Set the format that you want to use: data->format = PXCImage::PIXEL_FORMAT_RGB32; // For example 4 bytes in this case (8 * 4 = 32) //Create a cv::Mat black canvas based on the size of the color image int width = color->QueryInfo().width; int height = color->QueryInfo().height; cv::Mat frameColor = cv::Mat::zeros(height, width, CV_8UC3); //Now get access to the memory of the image: color->AcquireAccess(PXCImage::ACCESS_READ, data->format, data); //Now we just need to paint the canvas with each pixel from the image data pxcBYTE *cpixels=data->planes[0]; int x = 0, y = 0; for(int i=0; i < width * height; i++) { //BGRA //Read the first 3 bytes of each 4 bytes, and ignore the last one pxcBYTE bvalue = cpixels[i * 4 + 0]; pxcBYTE gvalue = cpixels[i * 4 + 1]; pxcBYTE rvalue = cpixels[i * 4 + 2]; unsigned int bvalueUchar = static_cast<unsigned int>(bvalue); unsigned int gvalueUchar = static_cast<unsigned int>(gvalue); unsigned int rvalueUchar = static_cast<unsigned int>(rvalue); frameColor.at<cv::Vec3b>(y, x)[0] = (bvalueUchar); frameColor.at<cv::Vec3b>(y, x)[1] = (gvalueUchar); frameColor.at<cv::Vec3b>(y, x)[2] = (rvalueUchar); //Advance, one pixel at a time (can be done better of course!) x += 1; if(x >= width) { x = 0; y += 1; } } //At the end, release all the used memory color->ReleaseAccess(data); delete data;
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It depends on what type of data you want to get, and in what format.
For example, to get a color image, you could do something like this: (it can be done more efficiently, and you should error check on each step, but this should be easy to understand)
Let's say you have a color image:
PXCImage *color
You can create a cv::Mat color image based on it:
//First, create an ImageData object: PXCImage::ImageData * data = new PXCImage::ImageData; //Set the format that you want to use: data->format = PXCImage::PIXEL_FORMAT_RGB32; // For example 4 bytes in this case (8 * 4 = 32) //Create a cv::Mat black canvas based on the size of the color image int width = color->QueryInfo().width; int height = color->QueryInfo().height; cv::Mat frameColor = cv::Mat::zeros(height, width, CV_8UC3); //Now get access to the memory of the image: color->AcquireAccess(PXCImage::ACCESS_READ, data->format, data); //Now we just need to paint the canvas with each pixel from the image data pxcBYTE *cpixels=data->planes[0]; int x = 0, y = 0; for(int i=0; i < width * height; i++) { //BGRA //Read the first 3 bytes of each 4 bytes, and ignore the last one pxcBYTE bvalue = cpixels[i * 4 + 0]; pxcBYTE gvalue = cpixels[i * 4 + 1]; pxcBYTE rvalue = cpixels[i * 4 + 2]; unsigned int bvalueUchar = static_cast<unsigned int>(bvalue); unsigned int gvalueUchar = static_cast<unsigned int>(gvalue); unsigned int rvalueUchar = static_cast<unsigned int>(rvalue); frameColor.at<cv::Vec3b>(y, x)[0] = (bvalueUchar); frameColor.at<cv::Vec3b>(y, x)[1] = (gvalueUchar); frameColor.at<cv::Vec3b>(y, x)[2] = (rvalueUchar); //Advance, one pixel at a time (can be done better of course!) x += 1; if(x >= width) { x = 0; y += 1; } } //At the end, release all the used memory color->ReleaseAccess(data); delete data;
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you for your reply.
I now understood the planes thing.However what exactly is the pitch?
Also,what happens if I also want the depth pixels?
Same thing exactly but with only 1 value per pixel?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Marios,
I recently made a video tutorial explaining how to get the depth, IR, and colour streams into OpenCV using a single and a multi threaded approach. You might find this useful:
https://software.intel.com/en-us/forums/realsense/topic/595033

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page