Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Calculate the distortion of two nearly identical Contours with “matchShapes()” and rotation of one contour [on hold]

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;

     for( double aDelAngle = 0; aDelAngle <= 2*3.14159; aDelAngle = aDelAngle + 0.01 )
     {
        aDelAngle = deg;
        // 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;

Calculate the distortion of two nearly identical Contours with “matchShapes()” and rotation of one contour [on hold]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;

     for( double aDelAngle = 0; aDelAngle <= 2*3.14159; aDelAngle = aDelAngle + 0.01 )
     {
        aDelAngle = deg;
        // 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;