Ask Your Question

Row and Col problem when Mat represents 3d point cloud

asked 2018-04-13 16:28:56 -0600

Tab gravatar image

updated 2018-04-15 10:01:55 -0600

The row and col of a Mat to represent 3d point cloud in OpenCV is N * 3, N is the number of the points in the cloud and 3 is the x, y, z coordinate respectively. For example, when I use method loadPLYSimple to load data from PLY file I will get N * 3 Mat, when I use the Flann KDTREE, I need to pass N * 3 Mat as the parameter... But the problem is that when I try to perform a transformation on the data, such as rotation. If we have a 3 * 3 rotation Mat R, and the points Mat pc N * 3, the common way is just R * pc. However, pc is N * 3, so we need to do some extra transpose work. I'm not familiar with OpenCV, I just want to know if there is any better way to do that instead of doing the transpose work each time? Or maybe there is something which I do not understand hidden behind?Thanks.

edit retag flag offensive close merge delete

1 answer

Sort by » oldest newest most voted

answered 2018-04-15 12:07:33 -0600

LBerger gravatar image

I hope it will help you :

Mat R= (Mat_<double>(3, 3) << 1, 0, 0, 0, cos(CV_PI/4), -sin(CV_PI / 4), 0, sin(CV_PI / 4),cos(CV_PI / 4));
Mat p= (Mat_<double>(2, 3) << 1, 0, 0, 0,1,0);
for (int i = 0; i < p.rows; i++)
    cout << R * p.row(i).t() << endl;
edit flag offensive delete link more


Thank you, that's what I mean the "extra transpose work". I wonder why not just use 3 * N Mat to represent 3d points to make the computation easier?

Tab gravatar imageTab ( 2018-04-15 12:52:36 -0600 )edit

transpose before matrix operation p.col(i) is only a roi (no deep copy)

LBerger gravatar imageLBerger ( 2018-04-15 13:56:48 -0600 )edit

Thanks. I just realize that store Mat data in this way (N*3) can be more efficient when accessing memory.

Tab gravatar imageTab ( 2018-04-29 11:00:57 -0600 )edit

Question Tools

1 follower


Asked: 2018-04-13 16:28:56 -0600

Seen: 712 times

Last updated: Apr 15 '18