Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to color point cloud from image pixels?

I am using google tango tablet to acquire point cloud data and RGB camera images. I want to create 3D scan of the room. For that i need to map 2D image pixels to point cloud point. I will be doing this with a lot of point clouds and corresponding images.Thus I need to write a code script which has two inputs 1. point cloud and 2. image taken from the same point in same direction and the script should output colored point cloud. How should i approach this & which platforms will be very simple to use?

like image 366
david Avatar asked Jun 04 '15 09:06

david


People also ask

How do you colorize a point cloud?

Colorize dense cloud 1. Select Tools Menu > Dense Cloud > Colorize Dense Cloud command. 2. Select the Source data for the dense cloud colorization as Images.

Can LiDAR capture color?

Ordinarily, a LiDAR scanner won't capture colour. Typical LiDAR data includes elevation or intensity values. Colour-enabled LiDAR scanners could play a big part in the future development of scanning. In the meantime, there are more reliable ways to colourise data during and after capture.

What are 3D point clouds?

A Point Cloud is a 3D visualization made up of thousands or even millions of georeferenced points. Point clouds provide high-resolution data without the distortion sometimes present in 3D mesh models and are commonly used in industry-standard software.


1 Answers

Here is the math to map a 3D point v to 2D pixel space in the camera image (assuming that v already incorporates the extrinsic camera position and orientation, see note at bottom*):

// Project to tangent space.
vec2 imageCoords = v.xy/v.z;

// Apply radial distortion.
float r2 = dot(imageCoords, imageCoords);
float r4 = r2*r2;
float r6 = r2*r4;
imageCoords *= 1.0 + k1*r2 + k2*r4 + k3*r6;

// Map to pixel space.
vec3 pixelCoords = cameraTransform*vec3(imageCoords, 1);

Where cameraTransform is the 3x3 matrix:

[ fx   0  cx ]
[  0  fy  cy ]
[  0   0   1 ]

with fx, fy, cx, cy, k1, k2, k3 from TangoCameraIntrinsics.

pixelCoords is declared vec3 but is actually 2D in homogeneous coordinates. The third coordinate is always 1 and so can be ignored for practical purposes.

Note that if you want texture coordinates instead of pixel coordinates, that is just another linear transform that can be premultiplied onto cameraTransform ahead of time (as is any top-to-bottom vs. bottom-to-top scanline addressing).

As for what "platform" (which I loosely interpreted as "language") is simplest, the native API seems to be the most straightforward way to get your hands on camera pixels, though it appears people have also succeeded with Unity and Java.


* Points delivered by TangoXYZij already incorporate the depth camera extrinsic transform. Technically, because the current developer tablet shares the same hardware between depth and color image acquisition, you won't be able to get a color image that exactly matches unless both your device and your scene are stationary. Fortunately in practice, most applications can probably assume that neither the camera pose nor the scene changes enough in one frame time to significantly affect color lookup.

like image 100
rhashimoto Avatar answered Nov 09 '22 12:11

rhashimoto