# Calculate the distortion of two nearly identical Contours with “matchShapes()” and rotation of one contour

I have two files:

1. A .bmp file which shows a contour of an object made by AutoCAD
2. A image of the object made by a camera

From both files I extracted the contour of the object with findContours(). So i got 2 contours.

1. Contour from the .bmp file
2. Contour from the object of the camera image

My problem is, that the object can be distorted in comparison to the contour from the .bmp file. My task is to get the angle between both contours.

I tried to show my problem with this picture. The lightning in the image is distorted in comparison to the contour from the .bmp file

My first approach was a bounded rectangle around both contours. This worked good but in some cases the bounded rectangle isn't singular.

In the second approach I rotate one contour about an specific delta a and then get the value from "matchShapes()". I think that I should get the smallest value, when i rotated exactly about the angle between the contours. But this didn't worked. Here is my code for the rotation:

     int index_contour = 0;
float ret_contour_rot = 10;
//Dummy contour
vector<vector<Point> > conture_bmp_rotated = mcontours_bmp;
Point2f aSWP;
Point2f aCP;
Point2f aCP_rot;
Point2f atranspt;

{
// get moments
Moments amoments;
amoments = moments( mcontours_bmp[ index_contour ], false );

//get center of gravity
aSWP = Point2f( amoments.m10 / amoments.m00, amoments.m01 / amoments.m00 );

for( int i = 0; i < (int) mcontours_bmp[ index_contour ].size(); i++ )
{
//get first contour point
aCP = Point2f( mcontours_bmp[ index_contour ][ i ].x, mcontours_bmp[ index_contour ][ i ].y );

//vector between contour point and center of gravity
atranspt.x = aCP.x - aSWP.x;
atranspt.y = aCP.y - aSWP.y;

// get rotated contour point
aCP_rot.x = cos( aDelAngle ) * atranspt.x - sin( aDelAngle ) * atranspt.y + aSWP.x;
aCP_rot.y = sin( aDelAngle ) * atranspt.x + cos( aDelAngle ) * atranspt.y + aSWP.y;

//copy point in new contour
mcontours_bmp_rotated[ index_contour ][ i ].x = aCP_rot.x;
mcontours_bmp_rotated[ index_contour ][ i ].y = aCP_rot.y;
}

float aret_contour_rot_act = matchShapes( conture_dxf_rotated[ index_contour ], mcontours_image[index_contour ], 1, 3 );

// get the smallest return value from matchShapes
if( aret_contour_rot_act < aret_contour_rot )
{
aret_contour_rot = aret_contour_rot_act;
}
cout << "rot ret: " << aret_contour_rot_act << endl;
cout << "rot deg: " << deg << endl;
}
cout << "rot ret ende: " << aret_contour_rot << endl;
cout << "rot deg ende: " << degree << endl;

edit retag close merge delete

( 2016-11-10 08:46:03 -0500 )edit

Sort by » oldest newest most voted

Thank you I will check it. Is the supposition rigth that "matchShapes()" should give the smallest return value when i rotate one contour in the position of my image contour?

more

Official site

GitHub

Wiki

Documentation