Update to 2.0.0 tree from current Fremantle build
[opencv] / cvaux / src / cvmorphcontours.cpp
diff --git a/cvaux/src/cvmorphcontours.cpp b/cvaux/src/cvmorphcontours.cpp
deleted file mode 100644 (file)
index 9d34291..0000000
+++ /dev/null
@@ -1,855 +0,0 @@
-/*M///////////////////////////////////////////////////////////////////////////////////////
-//
-//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
-//
-//  By downloading, copying, installing or using the software you agree to this license.
-//  If you do not agree to this license, do not download, install,
-//  copy or use the software.
-//
-//
-//                        Intel License Agreement
-//                For Open Source Computer Vision Library
-//
-// Copyright (C) 2000, Intel Corporation, all rights reserved.
-// Third party copyrights are property of their respective owners.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-//   * Redistribution's of source code must retain the above copyright notice,
-//     this list of conditions and the following disclaimer.
-//
-//   * Redistribution's in binary form must reproduce the above copyright notice,
-//     this list of conditions and the following disclaimer in the documentation
-//     and/or other materials provided with the distribution.
-//
-//   * The name of Intel Corporation may not be used to endorse or promote products
-//     derived from this software without specific prior written permission.
-//
-// This software is provided by the copyright holders and contributors "as is" and
-// any express or implied warranties, including, but not limited to, the implied
-// warranties of merchantability and fitness for a particular purpose are disclaimed.
-// In no event shall the Intel Corporation or contributors be liable for any direct,
-// indirect, incidental, special, exemplary, or consequential damages
-// (including, but not limited to, procurement of substitute goods or services;
-// loss of use, data, or profits; or business interruption) however caused
-// and on any theory of liability, whether in contract, strict liability,
-// or tort (including negligence or otherwise) arising in any way out of
-// the use of this software, even if advised of the possibility of such damage.
-//
-//M*/
-
-#include "_cvaux.h"
-
-#define PATH_TO_E       1
-#define PATH_TO_SE      2
-#define PATH_TO_S       3
-
-#define K_S         2
-#define E_S         2
-#define C_S         .01
-#define K_Z         5000
-#define K_NM        50000
-#define K_B         40
-#define NULL_EDGE   0.001f
-#define inf         DBL_MAX
-
-typedef struct __CvWork
-{
-    double w_east;
-    double w_southeast;
-    double w_south;
-    char path_e;
-    char path_se;
-    char path_s;
-}_CvWork;
-
-
-double _cvBendingWork(  CvPoint2D32f* B0,
-                        CvPoint2D32f* F0,
-                        CvPoint2D32f* B1,
-                        CvPoint2D32f* F1/*,
-                        CvPoint* K */);
-
-double _cvStretchingWork(CvPoint2D32f* P1,
-                         CvPoint2D32f* P2);
-
-void _cvWorkEast     (int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2);
-void _cvWorkSouthEast(int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2);
-void _cvWorkSouth    (int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2);
-
-static CvPoint2D32f null_edge = {0,0};
-
-double _cvStretchingWork(CvPoint2D32f* P1,
-                         CvPoint2D32f* P2)
-{
-    double L1,L2, L_min, dL;
-
-    L1 = sqrt( (double)P1->x*P1->x + P1->y*P1->y);
-    L2 = sqrt( (double)P2->x*P2->x + P2->y*P2->y);
-    
-    L_min = MIN(L1, L2);
-    dL = fabs( L1 - L2 );
-
-    return K_S * pow( dL, E_S ) / ( L_min + C_S*dL );
-}
-
-
-////////////////////////////////////////////////////////////////////////////////////
-double _cvBendingWork(  CvPoint2D32f* B0,
-                        CvPoint2D32f* F0,
-                        CvPoint2D32f* B1,
-                        CvPoint2D32f* F1/*,
-                        CvPoint* K*/)
-{
-    CvPoint2D32f Q( CvPoint2D32f q0, CvPoint2D32f q1, CvPoint2D32f q2, double t );
-    double angle( CvPoint2D32f A, CvPoint2D32f B );
-
-    CvPoint2D32f Q0, Q1, Q2;
-    CvPoint2D32f Q1_nm = { 0, 0 }, Q2_nm = { 0, 0 };
-    double d0, d1, d2, des, t_zero;
-    double k_zero, k_nonmon;
-    CvPoint2D32f center;
-    double check01, check02;
-    char check_origin;
-    double d_angle, d_nm_angle;
-/*
-    if( (B0->x==0) && (B0->y==0) )
-    {
-        if( (F0->x==0) && (F0->y==0) )
-        {
-            B1->x = -B1->x;
-            B1->y = -B1->y;
-
-            d_angle = acos( (B1->x*F1->x + B1->y*F1->y)/sqrt( (B1->x*B1->x + B1->y*B1->y)*(F1->x*F1->x + F1->y*F1->y) ) );
-            d_angle = CV_PI - d_angle;
-
-            B1->x = -B1->x;
-            B1->y = -B1->y;
-
-            //return d_angle*K_B;
-            return 100;
-        }
-        K->x = -K->x;
-        K->y = -K->y;
-        B1->x = -B1->x;
-        B1->y = -B1->y;
-
-        d_angle = acos( (B1->x*F1->x + B1->y*F1->y)/sqrt( (B1->x*B1->x + B1->y*B1->y)*(F1->x*F1->x + F1->y*F1->y) ) );
-        d_angle = d_angle - acos( (F0->x*K->x + F0->y*K->y)/sqrt( (F0->x*F0->x + F0->y*F0->y)*(K->x*K->x + K->y*K->y) ) );
-        d_angle = d_angle - CV_PI*0.5;
-        d_angle = fabs(d_angle);
-
-        
-        K->x = -K->x;
-        K->y = -K->y;
-        B1->x = -B1->x;
-        B1->y = -B1->y;
-
-        //return d_angle*K_B;
-        return 100;
-    }
-
-
-    if( (F0->x==0) && (F0->y==0) )
-        {
-            K->x = -K->x;
-            K->y = -K->y;
-            B1->x = -B1->x;
-            B1->y = -B1->y;
-
-            d_angle = acos( (B1->x*F1->x + B1->y*F1->y)/sqrt( (B1->x*B1->x + B1->y*B1->y)*(F1->x*F1->x + F1->y*F1->y) ) );
-            d_angle = d_angle - acos( (B0->x*K->x + B0->y*K->y)/sqrt( (B0->x*B0->x + B0->y*B0->y)*(K->x*K->x + K->y*K->y) ) );
-            d_angle = d_angle - CV_PI*0.5;
-            d_angle = fabs(d_angle);
-
-            K->x = -K->x;
-            K->y = -K->y;
-            B1->x = -B1->x;
-            B1->y = -B1->y;
-
-            //return d_angle*K_B;
-            return 100;
-        }
-///////////////
-
-    if( (B1->x==0) && (B1->y==0) )
-    {
-        if( (F1->x==0) && (F1->y==0) )
-        {
-            B0->x = -B0->x;
-            B0->y = -B0->y;
-
-            d_angle = acos( (B0->x*F0->x + B0->y*F0->y)/sqrt( (B0->x*B0->x + B0->y*B0->y)*(F0->x*F0->x + F0->y*F0->y) ) );
-            d_angle = CV_PI - d_angle;
-
-            B0->x = -B0->x;
-            B0->y = -B0->y;
-
-            //return d_angle*K_B;
-            return 100;
-        }
-        K->x = -K->x;
-        K->y = -K->y;
-        B0->x = -B0->x;
-        B0->y = -B0->y;
-
-        d_angle = acos( (B0->x*F0->x + B0->y*F0->y)/sqrt( (B0->x*B0->x + B0->y*B0->y)*(F0->x*F0->x + F0->y*F0->y) ) );
-        d_angle = d_angle - acos( (F1->x*K->x + F1->y*K->y)/sqrt( (F1->x*F1->x + F1->y*F1->y)*(K->x*K->x + K->y*K->y) ) );
-        d_angle = d_angle - CV_PI*0.5;
-        d_angle = fabs(d_angle);
-
-        K->x = -K->x;
-        K->y = -K->y;
-        B0->x = -B0->x;
-        B0->y = -B0->y;
-
-        //return d_angle*K_B;
-        return 100;
-    }
-
-
-    if( (F1->x==0) && (F1->y==0) )
-        {
-            K->x = -K->x;
-            K->y = -K->y;
-            B0->x = -B0->x;
-            B0->y = -B0->y;
-
-            d_angle = acos( (B0->x*F0->x + B0->y*F0->y)/sqrt( (B0->x*B0->x + B0->y*B0->y)*(F0->x*F0->x + F0->y*F0->y) ) );
-            d_angle = d_angle - acos( (B1->x*K->x + B1->y*K->y)/sqrt( (B1->x*B1->x + B1->y*B1->y)*(K->x*K->x + K->y*K->y) ) );
-            d_angle = d_angle - CV_PI*0.5;
-            d_angle = fabs(d_angle);
-
-            K->x  = -K->x;
-            K->y  = -K->y;
-            B0->x = -B0->x;
-            B0->y = -B0->y;
-
-            //return d_angle*K_B;
-            return 100;
-        }
-
-*/
-
-/*
-    B0->x = -B0->x;
-    B0->y = -B0->y;
-    B1->x = -B1->x;
-    B1->y = -B1->y;
-*/
-    Q0.x = F0->x * (-B0->x) + F0->y * (-B0->y);
-    Q0.y = F0->x * (-B0->y) - F0->y * (-B0->x);
-
-    Q1.x = 0.5f*( (F1->x * (-B0->x) + F1->y * (-B0->y)) + (F0->x * (-B1->x) + F0->y * (-B1->y)) );
-    Q1.y = 0.5f*( (F1->x * (-B0->y) - F1->y * (-B0->x)) + (F0->x * (-B1->y) - F0->y * (-B1->x)) );
-
-    Q2.x = F1->x * (-B1->x) + F1->y * (-B1->y);
-    Q2.y = F1->x * (-B1->y) - F1->y * (-B1->x);
-
-    d0 = Q0.x * Q1.y - Q0.y * Q1.x;
-    d1 = 0.5f*(Q0.x * Q2.y - Q0.y * Q2.x);
-    d2 = Q1.x * Q2.y - Q1.y * Q2.x;
-
-    // Check angles goes to zero
-    des = Q1.y*Q1.y - Q0.y*Q2.y;
-
-    k_zero = 0;
-
-    if( des >= 0 )
-    {
-        t_zero = ( Q0.y - Q1.y + sqrt(des) )/( Q0.y - 2*Q1.y + Q2.y );
-
-        if( (0 < t_zero) && (t_zero < 1) && ( Q(Q0, Q1, Q2, t_zero).x > 0 ) )
-        {
-            k_zero = inf;
-        }
-
-        t_zero = ( Q0.y - Q1.y - sqrt(des) )/( Q0.y - 2*Q1.y + Q2.y );
-
-        if( (0 < t_zero) && (t_zero < 1) && ( Q(Q0, Q1, Q2, t_zero).x > 0 ) )
-        {
-            k_zero = inf;
-        }
-    }
-
-    // Check nonmonotonic
-    des = d1*d1 - d0*d2;
-
-    k_nonmon = 0;
-
-    if( des >= 0 )
-    {
-        t_zero = ( d0 - d1 - sqrt(des) )/( d0 - 2*d1 + d2 );
-
-        if( (0 < t_zero) && (t_zero < 1) )
-        {
-            k_nonmon = 1;
-            Q1_nm = Q(Q0, Q1, Q2, t_zero);
-        }
-
-        t_zero = ( d0 - d1 + sqrt(des) )/( d0 - 2*d1 + d2 );
-
-        if( (0 < t_zero) && (t_zero < 1) )
-        {
-            k_nonmon += 2;
-            Q2_nm = Q(Q0, Q1, Q2, t_zero);
-        }
-    }
-
-    // Finde origin lie in Q0Q1Q2
-    check_origin = 1;
-
-    center.x = (Q0.x + Q1.x + Q2.x)/3;
-    center.y = (Q0.y + Q1.y + Q2.y)/3;
-
-    check01 = (center.x - Q0.x)*(Q1.y - Q0.y) + (center.y - Q0.y)*(Q1.x - Q0.x);
-    check02 = (-Q0.x)*(Q1.y - Q0.y) + (-Q0.y)*(Q1.x - Q0.x);
-    if( check01*check02 > 0 )
-    {
-        check01 = (center.x - Q1.x)*(Q2.y - Q1.y) + (center.y - Q1.y)*(Q2.x - Q1.x);
-        check02 = (-Q1.x)*(Q2.y - Q1.y) + (-Q1.y)*(Q2.x - Q1.x);
-        if( check01*check02 > 0 )
-        {
-            check01 = (center.x - Q2.x)*(Q0.y - Q2.y) + (center.y - Q2.y)*(Q0.x - Q2.x);
-            check02 = (-Q2.x)*(Q0.y - Q2.y) + (-Q2.y)*(Q0.x - Q2.x);
-            if( check01*check02 > 0 )
-            {
-                check_origin = 0;
-            }
-        }
-    }
-
-    // Calculate angle
-    d_nm_angle = 0;
-    d_angle = angle(Q0,Q2);
-    if( k_nonmon == 0 )
-    {
-        if( check_origin == 0 )
-        {
-        }
-        else
-        {
-            d_angle = 2*CV_PI - d_angle;
-        }
-    }
-    else
-    {
-        if( k_nonmon == 1 )
-        {
-            d_nm_angle = angle(Q0,Q1_nm);
-            if(d_nm_angle > d_angle)
-            {
-                d_nm_angle = d_nm_angle - d_angle;
-            }
-        }
-
-        if( k_nonmon == 2 )
-        {
-            d_nm_angle = angle(Q0,Q2_nm);
-            if(d_nm_angle > d_angle)
-            {
-                d_nm_angle = d_nm_angle - d_angle;
-            }
-        }
-
-        if( k_nonmon == 3 )
-        {
-            d_nm_angle = angle(Q0,Q1_nm);
-            if(d_nm_angle > d_angle)
-            {
-                d_nm_angle = d_nm_angle - d_angle;
-                d_nm_angle = d_nm_angle + angle(Q0, Q2_nm);
-            }
-            else
-            {
-                d_nm_angle = d_nm_angle + angle(Q2,Q2_nm);
-            }
-        }
-    }
-/*
-    B0->x = -B0->x;
-    B0->y = -B0->y;
-    B1->x = -B1->x;
-    B1->y = -B1->y;
-*/
-    return d_angle*K_B + d_nm_angle*K_NM + k_zero*K_Z;
-    //return 0;
-}
-
-
-/////////////////////////////////////////////////////////////////////////////////
-void _cvWorkEast(int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2)
-{
-    double w1,w2;
-    CvPoint2D32f small_edge;
-
-    //W[i,j].w_east
-    w1 = W[i-1][j].w_east /*+ _cvBendingWork(   &edges1[i-2],
-                                            &edges1[i-1],
-                                            &null_edge ,
-                                            &null_edge,
-                                            NULL)*/;
-
-    small_edge.x = NULL_EDGE*edges1[i-1].x;
-    small_edge.y = NULL_EDGE*edges1[i-1].y;
-
-    w2 = W[i-1][j].w_southeast + _cvBendingWork(&edges1[i-2],
-                                                &edges1[i-1],
-                                                &edges2[j-1],
-                                                /*&null_edge*/&small_edge/*,
-                                                &edges2[j]*/);
-
-    if(w1<w2)
-    {
-        W[i][j].w_east = w1 + _cvStretchingWork( &edges1[i-1], &null_edge );
-        W[i][j].path_e = PATH_TO_E;
-    }
-    else
-    {
-        W[i][j].w_east = w2 + _cvStretchingWork( &edges1[i-1], &null_edge );
-        W[i][j].path_e = PATH_TO_SE;
-    }
-}
-
-
-
-
-
-////////////////////////////////////////////////////////////////////////////////////
-void _cvWorkSouthEast(int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2)
-{
-    double w1,w2,w3;
-    CvPoint2D32f small_edge;
-
-    //W[i,j].w_southeast
-    small_edge.x = NULL_EDGE*edges1[i-2].x;
-    small_edge.y = NULL_EDGE*edges1[i-2].y;
-
-    w1 = W[i-1][j-1].w_east + _cvBendingWork(&edges1[i-2],
-                                            &edges1[i-1],                                           
-                                            /*&null_edge*/&small_edge,
-                                            &edges2[j-1]/*,
-                                            &edges2[j-2]*/);
-
-    w2 = W[i-1][j-1].w_southeast + _cvBendingWork(  &edges1[i-2],
-                                                    &edges1[i-1],
-                                                    &edges2[j-2],
-                                                    &edges2[j-1]/*,
-                                                    NULL*/);
-
-    small_edge.x = NULL_EDGE*edges2[j-2].x;
-    small_edge.y = NULL_EDGE*edges2[j-2].y;
-
-    w3 = W[i-1][j-1].w_south + _cvBendingWork(  /*&null_edge*/&small_edge,
-                                                &edges1[i-1],                                           
-                                                &edges2[j-2],
-                                                &edges2[j-1]/*,
-                                                &edges1[i-2]*/);
-
-    if( w1<w2 )
-    {
-        if(w1<w3)
-        {
-            W[i][j].w_southeast = w1 + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
-            W[i][j].path_se = PATH_TO_E;
-        }
-        else
-        {
-            W[i][j].w_southeast = w3 + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
-            W[i][j].path_se = 3;
-        }
-    }
-    else
-    {
-        if( w2<w3)
-        {
-            W[i][j].w_southeast = w2 + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
-            W[i][j].path_se = PATH_TO_SE;
-        }
-        else
-        {
-            W[i][j].w_southeast = w3 + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
-            W[i][j].path_se = 3;
-        }
-    }
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////////
-void _cvWorkSouth(int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2)
-{
-    double w1,w2;
-    CvPoint2D32f small_edge;
-
-    //W[i,j].w_south
-
-    small_edge.x = NULL_EDGE*edges2[j-1].x;
-    small_edge.y = NULL_EDGE*edges2[j-1].y;
-
-    w1 = W[i][j-1].w_southeast + _cvBendingWork(&edges1[i-1],
-                                                /*&null_edge*/&small_edge,
-                                                &edges2[j-2],
-                                                &edges2[j-1]/*,
-                                                &edges1[i]*/);
-
-    w2 = W[i][j-1].w_south /*+ _cvBendingWork(  &null_edge ,
-                                            &null_edge,
-                                            &edges2[j-2],
-                                            &edges2[j-1],
-                                            NULL)*/;
-
-    if( w1<w2 )
-    {
-        W[i][j].w_south = w1 + _cvStretchingWork( &null_edge, &edges2[j-1] );
-        W[i][j].path_s = PATH_TO_SE;
-    }
-    else
-    {
-        W[i][j].w_south = w2 + _cvStretchingWork( &null_edge, &edges2[j-1] );
-        W[i][j].path_s = 3;
-    }
-}
-
-//===================================================
-CvPoint2D32f Q(CvPoint2D32f q0,CvPoint2D32f q1,CvPoint2D32f q2,double t)
-{
-    CvPoint2D32f q;
-
-    q.x = (float)(q0.x*(1-t)*(1-t) + 2*q1.x*t*(1-t) + q2.x*t*t);
-    q.y = (float)(q0.y*(1-t)*(1-t) + 2*q1.y*t*(1-t) + q2.y*t*t);
-
-    return q;       
-}
-
-double angle(CvPoint2D32f A, CvPoint2D32f B)
-{
-    return acos( (A.x*B.x + A.y*B.y)/sqrt( (double)(A.x*A.x + A.y*A.y)*(B.x*B.x + B.y*B.y) ) );
-}
-
-/***************************************************************************************\
-*
-*   This function compute intermediate polygon between contour1 and contour2
-*
-*   Correspondence between points of contours specify by corr
-*
-*   param = [0,1];  0 correspondence to contour1, 1 - contour2
-*
-\***************************************************************************************/
-CvSeq* icvBlendContours(CvSeq* contour1, 
-                        CvSeq* contour2,
-                        CvSeq* corr,
-                        double param,
-                        CvMemStorage* storage)
-{
-    int j;
-    
-    CvSeqWriter writer01;
-    CvSeqReader reader01;
-
-    int Ni,Nj;              // size of contours
-    int i;                  // counter
-
-    CvPoint* point1;        // array of first contour point
-    CvPoint* point2;        // array of second contour point
-
-    CvPoint point_output;   // intermediate storage of ouput point
-
-    int corr_point;
-
-    // Create output sequence.
-    CvSeq* output = cvCreateSeq(0,                      
-                                sizeof(CvSeq),
-                                sizeof(CvPoint),
-                                storage );
-
-    // Find size of contours.
-    Ni = contour1->total + 1;
-    Nj = contour2->total + 1;
-
-    point1 = (CvPoint* )malloc( Ni*sizeof(CvPoint) );
-    point2 = (CvPoint* )malloc( Nj*sizeof(CvPoint) );
-
-    // Initialize arrays of point 
-    cvCvtSeqToArray( contour1, point1, CV_WHOLE_SEQ );
-    cvCvtSeqToArray( contour2, point2, CV_WHOLE_SEQ );
-
-    // First and last point mast be equal.
-    point1[Ni-1] = point1[0];
-    point2[Nj-1] = point2[0];
-
-    // Initializes process of writing to sequence.
-    cvStartAppendToSeq( output, &writer01);
-
-    i = Ni-1; //correspondence to points of contour1
-    for( ; corr; corr = corr->h_next )
-    {       
-        //Initializes process of sequential reading from sequence
-        cvStartReadSeq( corr, &reader01, 0 );
-
-        for(j=0; j < corr->total; j++)
-        {
-            // Read element from sequence.
-            CV_READ_SEQ_ELEM( corr_point, reader01 );
-
-            // Compute point of intermediate polygon.
-            point_output.x = cvRound(point1[i].x + param*( point2[corr_point].x - point1[i].x ));
-            point_output.y = cvRound(point1[i].y + param*( point2[corr_point].y - point1[i].y ));
-            
-            // Write element to sequence.
-            CV_WRITE_SEQ_ELEM( point_output, writer01 );
-        }
-        i--;
-    }
-    // Updates sequence header.
-    cvFlushSeqWriter( &writer01 );
-    
-    return output;
-}
-
-/**************************************************************************************************
-*
-*
-*
-*
-*
-*
-*
-*
-*
-*
-**************************************************************************************************/
-
-
-void icvCalcContoursCorrespondence(CvSeq* contour1, 
-                                   CvSeq* contour2, 
-                                   CvSeq** corr, 
-                                   CvMemStorage* storage)
-{
-    int i,j;                    // counter of cycles
-    int Ni,Nj;                  // size of contours
-    _CvWork** W;                // graph for search minimum of work
-
-    CvPoint* point1;            // array of first contour point
-    CvPoint* point2;            // array of second contour point
-    CvPoint2D32f* edges1;       // array of first contour edge
-    CvPoint2D32f* edges2;       // array of second contour edge
-
-    //CvPoint null_edge = {0,0};    //
-    CvPoint2D32f small_edge;
-    //double inf;                   // infinity
-
-    CvSeq* corr01;
-    CvSeqWriter writer;
-
-    char path;                  //
-
-    // Find size of contours
-    Ni = contour1->total + 1;
-    Nj = contour2->total + 1;
-
-    // Create arrays
-    W = (_CvWork**)malloc(sizeof(_CvWork*)*Ni);
-    for(i=0; i<Ni; i++)
-    {
-        W[i] = (_CvWork*)malloc(sizeof(_CvWork)*Nj);
-    }
-
-    point1 = (CvPoint* )malloc( Ni*sizeof(CvPoint) );
-    point2 = (CvPoint* )malloc( Nj*sizeof(CvPoint) );
-    edges1 = (CvPoint2D32f* )malloc( (Ni-1)*sizeof(CvPoint2D32f) );
-    edges2 = (CvPoint2D32f* )malloc( (Nj-1)*sizeof(CvPoint2D32f) );
-
-    // Initialize arrays of point 
-    cvCvtSeqToArray( contour1, point1, CV_WHOLE_SEQ );
-    cvCvtSeqToArray( contour2, point2, CV_WHOLE_SEQ );
-
-    point1[Ni-1] = point1[0];
-    point2[Nj-1] = point2[0];
-
-    for(i=0;i<Ni-1;i++)
-    {
-        edges1[i].x = (float)( point1[i+1].x - point1[i].x );
-        edges1[i].y = (float)( point1[i+1].y - point1[i].y );
-    };
-
-    for(i=0;i<Nj-1;i++)
-    {
-        edges2[i].x = (float)( point2[i+1].x - point2[i].x );
-        edges2[i].y = (float)( point2[i+1].y - point2[i].y );
-    };
-
-    // Find infinity constant 
-    //inf=1;
-/////////////
-
-//Find min path in graph
-
-/////////////
-    W[0][0].w_east      = 0;
-    W[0][0].w_south     = 0;
-    W[0][0].w_southeast = 0;
-
-    W[1][1].w_southeast = _cvStretchingWork( &edges1[0], &edges2[0] );
-    W[1][1].w_east = inf;
-    W[1][1].w_south = inf;
-    W[1][1].path_se = PATH_TO_SE;
-
-    W[0][1].w_south =  _cvStretchingWork( &null_edge, &edges2[0] );
-    W[0][1].path_s = 3;
-    W[1][0].w_east =  _cvStretchingWork( &edges2[0], &null_edge );
-    W[1][0].path_e = PATH_TO_E;
-
-    for( i=1; i<Ni; i++ )
-    {
-        W[i][0].w_south     = inf;
-        W[i][0].w_southeast = inf;
-    }
-
-    for(j=1; j<Nj; j++)
-    {
-        W[0][j].w_east      = inf;
-        W[0][j].w_southeast = inf;
-    }
-
-    for(i=2; i<Ni; i++)
-    {
-        j=0;/////////
-        W[i][j].w_east = W[i-1][j].w_east;
-        W[i][j].w_east = W[i][j].w_east /*+ 
-            _cvBendingWork( &edges1[i-2], &edges1[i-1], &null_edge, &null_edge, NULL )*/;
-        W[i][j].w_east = W[i][j].w_east + _cvStretchingWork( &edges2[i-1], &null_edge );
-        W[i][j].path_e = PATH_TO_E;
-        
-        j=1;//////////
-        W[i][j].w_south = inf;
-
-        _cvWorkEast (i, j, W, edges1, edges2);
-
-        W[i][j].w_southeast = W[i-1][j-1].w_east;
-        W[i][j].w_southeast = W[i][j].w_southeast + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
-
-        small_edge.x = NULL_EDGE*edges1[i-2].x;
-        small_edge.y = NULL_EDGE*edges1[i-2].y;
-
-        W[i][j].w_southeast = W[i][j].w_southeast + 
-            _cvBendingWork( &edges1[i-2], &edges1[i-1], /*&null_edge*/&small_edge, &edges2[j-1]/*, &edges2[Nj-2]*/);
-
-        W[i][j].path_se = PATH_TO_E;
-    }
-
-    for(j=2; j<Nj; j++)
-    {       
-        i=0;//////////
-        W[i][j].w_south = W[i][j-1].w_south;
-        W[i][j].w_south = W[i][j].w_south + _cvStretchingWork( &null_edge, &edges2[j-1] );
-        W[i][j].w_south = W[i][j].w_south /*+ 
-            _cvBendingWork( &null_edge, &null_edge, &edges2[j-2], &edges2[j-1], NULL )*/;
-        W[i][j].path_s = 3;
-
-        i=1;///////////
-        W[i][j].w_east= inf;
-
-        _cvWorkSouth(i, j, W, edges1, edges2);
-
-        W[i][j].w_southeast = W[i-1][j-1].w_south;
-        W[i][j].w_southeast = W[i][j].w_southeast + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
-
-        small_edge.x = NULL_EDGE*edges2[j-2].x;
-        small_edge.y = NULL_EDGE*edges2[j-2].y;
-
-        W[i][j].w_southeast = W[i][j].w_southeast + 
-            _cvBendingWork( /*&null_edge*/&small_edge, &edges1[i-1], &edges2[j-2], &edges2[j-1]/*, &edges1[Ni-2]*/);
-        W[i][j].path_se = 3;
-    }
-
-    for(i=2; i<Ni; i++)
-        for(j=2; j<Nj; j++)
-        {
-            _cvWorkEast     (i, j, W, edges1, edges2);
-            _cvWorkSouthEast(i, j, W, edges1, edges2);
-            _cvWorkSouth    (i, j, W, edges1, edges2);
-        }
-
-    i=Ni-1;j=Nj-1;
-
-    *corr = cvCreateSeq(0,                    
-                        sizeof(CvSeq),        
-                        sizeof(int),
-                        storage );
-
-    corr01 = *corr;
-    cvStartAppendToSeq( corr01, &writer );
-    if( W[i][j].w_east > W[i][j].w_southeast )
-        {
-            if( W[i][j].w_southeast > W[i][j].w_south )
-            {
-                path = 3;
-            }
-            else
-            {
-                path = PATH_TO_SE;
-            }
-        }
-        else
-        {
-            if( W[i][j].w_east < W[i][j].w_south )
-            {
-                path = PATH_TO_E;
-            }
-            else
-            {
-                path = 3;
-            }
-        }
-    do
-    {
-        CV_WRITE_SEQ_ELEM( j, writer );
-
-        switch( path ) 
-        {
-        case PATH_TO_E:
-            path = W[i][j].path_e;
-            i--;
-            cvFlushSeqWriter( &writer );
-            corr01->h_next = cvCreateSeq(   0,                    
-                                            sizeof(CvSeq),        
-                                            sizeof(int),
-                                            storage );
-            corr01 = corr01->h_next;
-            cvStartAppendToSeq( corr01, &writer );
-            break;
-        
-        case PATH_TO_SE:
-            path = W[i][j].path_se;
-            j--; i--;
-            cvFlushSeqWriter( &writer );
-            corr01->h_next = cvCreateSeq(   0,                    
-                                            sizeof(CvSeq),        
-                                            sizeof(int),
-                                            storage );
-            corr01 = corr01->h_next;
-            cvStartAppendToSeq( corr01, &writer );
-            break;
-
-        case 3:
-            path = W[i][j].path_s;
-            j--;
-            break;
-        }
-
-    } while( (i>=0) && (j>=0) );
-    cvFlushSeqWriter( &writer );
-
-    // Free memory
-    for(i=1;i<Ni;i++)
-    {
-        free(W[i]);
-    }
-    free(W);
-    free(point1);
-    free(point2);
-    free(edges1);
-    free(edges2);
-}
-