Ask Your Question

how to use ICP in openCV

asked 2018-06-06 08:57:13 -0600

w33z gravatar image


I want to write a small programm to understand how the ICP work and want to test it. But i don't understand the function call of the ICP function, see code...

Can somebody show me how to do the ICP with 2 MATs? Or Any Idea/tip?

#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
#include <icp.hpp>
#include <ppf_match_3d.hpp>
#include <ppf_helpers.hpp>

using namespace std;
using namespace cv;
using namespace ppf_match_3d;

int main() {

Mat outputPLY;

// load PLYs
Mat iFirst     = loadPLYSimple("1.ply");
Mat iSecond = loadPLYSimple("2.ply");

ICP icp;

    // i dont understand this function with its parameters
    // is this the ICP ? 
    int t = icp.registerModelToScene(iFirst, iSecond, ?...?);

    // save solution of ICP as new PLY

    return 0;
edit retag flag offensive close merge delete


please use current docs , not outdated 3.1.0

berak gravatar imageberak ( 2018-06-06 23:31:44 -0600 )edit

2 answers

Sort by » oldest newest most voted

answered 2018-06-13 06:03:56 -0600

w33z gravatar image

updated 2018-06-14 07:15:50 -0600

I calculated the normals with:

Mat pcNormals;
Vec3d viewpoint_1(0, 0, 0);
computeNormalsPC3d(pc, pcNormals, 6, false, viewpoint_1);

Now the PLYs look like:

format ascii 1.0
element vertex 38304
property float x
property float y
property float z
property float nx
property float ny
property float nz
0.000681958 -0.00157701 0.00381835 0.985197 0.0119866 -0.171006

And I tried the sample that you have refer. But I don't unerstand the outputs... I have PointClouds of an object with different views. for example one cloud shows the object from the front and the next pointcloud from 10° different angle an so on (every pointcloud sees only one side of the object). After all i want a 3D pointcloud of the whole object from the single point clouds.
Now I add two pointclouds to the sample, than I use the result and add another pointcloud to the sample. The output is the first input as single points instead a constant surface

sorry for the amateur questions - opencv is new for me.

left - right input 1 - input 2 - output image description

In my opinion, the dinosaur from the second image has to fit in to the scene, but this don't happen

edit flag offensive delete link more

answered 2018-06-06 23:51:10 -0600

berak gravatar image

updated 2018-06-07 01:55:14 -0600

i've never used it, but from the docs it should be like:

Matx44d pose; // transformation from model to scene
double error;
icp.registerModelToScene(iFirst, iSecond, error, pose);

// now you can transform the model into the scene:
Mat output = ppf_match_3d::transformPCPose(iFirst, pose);

note, that it expects (at least) the scene model to have proper normals, the PLY header should look like:

property float x
property float y
property float z
property float nx
property float ny
property float nz

also have a look at the sample here

edit flag offensive delete link more


thanks for your answer, it helped a lot.

ah ok, when I am right, I need the normals for the ICP algorithm, at the moment i have only the x,y,z data in my PLYs, so I need the normals too.

w33z gravatar imagew33z ( 2018-06-08 01:13:14 -0600 )edit

yes, the scene needs normals. if you have face information, then it's easy to generate(face) normals (cross-product of the triange edges)

in the meantime, you can try the ply files from the samples folder

berak gravatar imageberak ( 2018-06-08 01:36:51 -0600 )edit

Question Tools

1 follower


Asked: 2018-06-06 08:57:13 -0600

Seen: 4,767 times

Last updated: Jun 14 '18