Esempio n. 1
0
CvMat * LKInverseComp::currentEstimate()
{
    static float* ptemp1 = (float *)malloc(sizeof(float)*(nS+4));
    static float* ptemp2 = (float *)malloc(sizeof(float)*(nS+4));

    for (int i=0;i<(nS+4);i++)
    {
        ptemp1[i]=0;
        ptemp2[i]=0;
    }


    for (int i=0;i<(4);i++)
    {
        ptemp1[i]=param[i];

    }

    for (int i=4;i<(nS+4);i++)
    {
        ptemp2[i]=param[i];

    }

    CvMat * affShapeVec = computeShape(ptemp2);
    newDelaunayShapeCompute->calculateAffineWarpParameters(affShapeVec);
    affShapeVec = computeShape(ptemp1);
    newDelaunayShapeCompute->calculateAffineWarpParametersComposeWithCurrent(affShapeVec);

    CvMat * mat = cvCreateMat(1,totalnumberofpoints,CV_64FC1);

    for (int i=0;i<numberofpoints;i++)
    {
        double x,y;
        double finalx,finaly;
        finalx=0;
        finaly=0;
        int t=newDelaunayShapeCompute->ithNodeCode[i].count;
        if (t>0)
        {
            int xx=newDelaunayShapeCompute->ithNodeCode[i].triangles[0].xi;
            int yy=newDelaunayShapeCompute->ithNodeCode[i].triangles[0].yi;
            x = xx* newDelaunayShapeCompute->ithNodeCode[i].triangles[0].affine[0] + yy* newDelaunayShapeCompute->ithNodeCode[i].triangles[0].affine[1] + newDelaunayShapeCompute->ithNodeCode[i].triangles[0].affine[2];
            y = xx* newDelaunayShapeCompute->ithNodeCode[i].triangles[0].affine[3] + yy* newDelaunayShapeCompute->ithNodeCode[i].triangles[0].affine[4] + newDelaunayShapeCompute->ithNodeCode[i].triangles[0].affine[5];
            CvScalar s1,s2;
            s1.val[0]=x;
            s2.val[0]=y;
            cvSet2D(mat,0,2*i,s1);
            cvSet2D(mat,0,2*i+1,s2);
        }

    }


    return mat;

}
Esempio n. 2
0
InventorShape::InventorShape(Modeling::Shape::SharedPtr aShape) : shape(aShape) {
    group.reset(new SoGroup());

    separator.reset(new SoSeparator());
    group->addChild(separator.get());

    computeShape();
}
Esempio n. 3
0
void Ellipse::computeEllipseFromRegion(Region* const _region, const double _scale)
{
	m_dData1 = _region->getMeanData1();
	m_dData2 = _region->getMeanData2();
	m_dData3 = _region->getMeanData3();
	
	// compute inertia matrix
	
	double m00 = computeMoment(_region, 0, 0, _scale);
	double m01 = computeMoment(_region, 0, 1, _scale);
	double m10 = computeMoment(_region, 1, 0, _scale);
	double m11 = computeMoment(_region, 1, 1, _scale);
	double m20 = computeMoment(_region, 2, 0, _scale);
	double m02 = computeMoment(_region, 0, 2, _scale);
	
	m_dPosX = m10 / m00; 
	m_dPosY = m01 / m00;
	
	m_dIM00 = m20 / m00 - m_dPosX * m_dPosX;
	m_dIM01 = m11 / m00 - m_dPosX * m_dPosY;
	m_dIM10 = m_dIM01;
	m_dIM11 = m02 / m00 - m_dPosY * m_dPosY;
	
	// compute ellipse matrix and its properties
	
	double temp1 = m_dIM00 + m_dIM11;
	double temp2 = sqrt(pow(m_dIM00 - m_dIM11, 2) + 4 * pow(m_dIM01, 2));
	double temp3 = 0.0;
	
	m_dEValue1 = (temp1 + temp2) / 2.0; // eigenvalues
	m_dEValue2 = (temp1 - temp2) / 2.0;
	
	temp1 = m_dIM11 + m_dIM01 - m_dEValue1; // eigenvector 1
	temp2 = m_dEValue1 - m_dIM00 - m_dIM01;
	temp3 = sqrt(temp1 * temp1 + temp2 * temp2);
	m_dEVector11 = temp1 / temp3;
	m_dEVector12 = temp2 / temp3;
	
	temp1 = m_dIM11 + m_dIM01 - m_dEValue2; // eigenvector 2
	temp2 = m_dEValue2 - m_dIM00 - m_dIM01;
	temp3 = sqrt(temp1 * temp1 + temp2 * temp2);
	m_dEVector21 = temp1 / temp3;
	m_dEVector22 = temp2 / temp3;
	
	m_dLengthPA1 = 2 * sqrt(m_dEValue1); // lenght of principal axis 1
	m_dLengthPA2 = 2 * sqrt(m_dEValue2); // s.a. 2

	m_dAnglePA1 = - atan(m_dEVector12 / m_dEVector11); // angle of pricipla axis 1 (circular measure)
	m_dAnglePA2 = - atan(m_dEVector22 / m_dEVector21);
	
	const double pi = 3.141592653589;
	m_dArea = 4.0 * pi * sqrt(m_dIM00 * m_dIM11 - m_dIM01 * m_dIM01);
	m_dShape[0] = min(m_dLengthPA1, m_dLengthPA2) / max(m_dLengthPA1, m_dLengthPA2); // shape, near 1 = more circle like, near 0 = more line like
	
	m_dEM00 = 0.25 * (m_dEVector11 * m_dEVector11 / m_dEValue1 + m_dEVector21 * m_dEVector21 / m_dEValue2); // ellipse matrix
	m_dEM01 = 0.25 * (m_dEVector12 * m_dEVector11 / m_dEValue1 + m_dEVector21 * m_dEVector22 / m_dEValue2);
	m_dEM10 = m_dEM01;
	m_dEM11 = 0.25 * (m_dEVector12 * m_dEVector12 / m_dEValue1 + m_dEVector22 * m_dEVector22 / m_dEValue2);
	
	computeShape(_region, _scale);
}
Esempio n. 4
0
double LKInverseComp::iterate()
{

    if (iterateImage==NULL)
        return 0;
    //cvWaitKey(-1);

       double timer = (double)cvGetTickCount();

        //printf("\n");

        for (int i=0;i<(4);i++)
        {
            ptemp1[i]=param[i];


        }

        for (int i=4;i<(nS+4);i++)
        {
            ptemp2[i]=param[i];

        }

        CvMat * affShapeVec = computeShape(ptemp2);
        newDelaunay->calculateAffineWarpParameters(affShapeVec);
        affShapeVec = computeShape(ptemp1);
        newDelaunay->calculateAffineWarpParametersComposeWithCurrent(affShapeVec);

        for (int i=0;i<numberofpoints;i++)
        {
            double x,y;
            x=newDelaunay->ithNodeCode[i].triangles[0].xi;
            y=newDelaunay->ithNodeCode[i].triangles[0].yi;
            int k=0;
            double xx= x* newDelaunay->ithNodeCode[i].triangles[k].affine[0] + y* newDelaunay->ithNodeCode[i].triangles[k].affine[1] + newDelaunay->ithNodeCode[i].triangles[k].affine[2];
            double yy= x* newDelaunay->ithNodeCode[i].triangles[k].affine[3] + y* newDelaunay->ithNodeCode[i].triangles[k].affine[4] + newDelaunay->ithNodeCode[i].triangles[k].affine[5];

            CvScalar s1,s2;
            s1.val[0]=xx;
            s2.val[0]=yy;
            cvSet2D(srcShape,0,2*i,s1);
            cvSet2D(srcShape,0,2*i+1,s2);
        }

        // cvZero(ErrorImage);


        totalerror=0;
        bottomStepSize=0;
        topStepSize=0;
        for (int i=0;i<totalNumberOfPixels;i++)
        {
            int flag=1;


            pixel * pix = newDelaunay->getpixel(i);
            pixel *pix2 =newDelaunay->findCorrespondingPixelInImage(pix);

            if (((double)pix2->x)<(double)iterateImage->width && ((double)pix2->y)<(double)iterateImage->height )
            {
                if ((pix2->y)>=0 && (pix2->x)>=0)
                {
                    flag=0;
                    CvScalar val1,val2,val3;


                    val1.val[0]=(interpolate<uchar>(iterateImage,double(pix2->x),double(pix2->y)));

                    val2.val[0]=0;
                    if ((pix->y+pix->ty)>=0 && (pix->x+pix->tx)>=0)
                    {
                        val2.val[0]=interpolateMean[i];
                        val3.val[0] = val1.val[0]-val2.val[0];
                        bottomStepSize+=pow(val2.val[0],2);
                        topStepSize+=val2.val[0]*val1.val[0];
                        totalerror+=pow(val3.val[0],2);
                        ErrorImage->data.db[ (int(pix->y+pix->ty)*int(pix->width) + int(pix->x+pix->tx)) *ErrorImage->cols + 0 ] =val3.val[0];

                        //   cvSet2D(ErrorImage, int(pix->y+pix->ty)*int(pix->width+10) + int(pix->x+pix->tx),0,val3);

                    }

                }

            }



        }
//        timer = (double)cvGetTickCount() - timer;
//        printf( " Error Estimate = %gms\n", (timer)/((double)cvGetTickFrequency()*1000.) );
//
//




        //printf("Error = %e \n",totalerror);

//        timer= (double)cvGetTickCount();
        static CvMat * parameter = cvCreateMat( nS+4,1, CV_64FC1);
        cvMatMul(HessianMatrixInverse_steepestDescentImageTranspose,ErrorImage,parameter);

//
//
//        timer = (double)cvGetTickCount() - timer;
//        printf( " MULTIPLICATION = %gms\n", timer/((double)cvGetTickFrequency()*1000.) );



        //printf("Rat %e\n",(bottomStepSize/topStepSize));
        for (int i=0;i<(nS+4);i++)
        {
            CvScalar s = cvGet2D(parameter,i,0);
            negNewParam[i] =-1*(bottomStepSize/topStepSize)*s.val[0];
        }
        for (int i=0;i<(4);i++)
        {
            negNewParam4[i]= negNewParam[i];

        }
        for (int i=4;i<(nS+4);i++)
        {
            negNewParamnS[i]= negNewParam[i];

        }

//        timer= (double)cvGetTickCount();

        affShapeVec = computeShape(negNewParamnS);  //Modified
        newDelaunayInverse->calculateAffineWarpParameters(affShapeVec);
        affShapeVec = computeShape(negNewParam4);
        newDelaunayInverse->calculateAffineWarpParametersComposeWithCurrent(affShapeVec);
//        timer = (double)cvGetTickCount() - timer;
//        printf( " Compose = %gms\n", timer/((double)cvGetTickFrequency()*1000.) );
        for (int i=0;i<numberofpoints;i++)
        {
            double x,y;
            double finalx,finaly;
            finalx=0;
            finaly=0;
            int ind = newDelaunayInverse->ithNodeCode[i].count;
            x=newDelaunayInverse->ithNodeCode[i].triangles[0].xi;
            y=newDelaunayInverse->ithNodeCode[i].triangles[0].yi;


            for (int k=0;k<ind;k++)
            {
                double xx= x* newDelaunayInverse->ithNodeCode[i].triangles[k].affine[0] + y* newDelaunayInverse->ithNodeCode[i].triangles[k].affine[1] + newDelaunayInverse->ithNodeCode[i].triangles[k].affine[2];
                double yy= x* newDelaunayInverse->ithNodeCode[i].triangles[k].affine[3] + y* newDelaunayInverse->ithNodeCode[i].triangles[k].affine[4] + newDelaunayInverse->ithNodeCode[i].triangles[k].affine[5];
                finalx+= xx* newDelaunay->ithNodeCode[i].triangles[k].affine[0] + yy* newDelaunay->ithNodeCode[i].triangles[k].affine[1] + newDelaunay->ithNodeCode[i].triangles[k].affine[2];
                finaly+= xx* newDelaunay->ithNodeCode[i].triangles[k].affine[3] + yy* newDelaunay->ithNodeCode[i].triangles[k].affine[4] + newDelaunay->ithNodeCode[i].triangles[k].affine[5];

            }
            finalx/=ind;
            finaly/=ind;
            CvScalar s1,s2;
            s1.val[0]=finalx;
            s2.val[0]=finaly;
            cvSet2D(destShape,0,2*i,s1);
            cvSet2D(destShape,0,2*i+1,s2);
        }

        cvAddWeighted(srcShape, 0.3, destShape, 0.7, 0, destShape);



        cvSub(destShape,meanShape,destShapeTemp);
        for (int i=0;i<4;i++)
        {
            double p=cvDotProduct(combineshapevectors[i],destShapeTemp);
            negNewParam4[i]=-1*p;
            Param4[i]=p;
        }

        for (int j=0;j<totalnumberofpoints;j++)
        {
            CvScalar s2 = cvGet2D(destShape,0,j);
            double p=0;
            for (int i=0;i<4;i++)
            {
                CvScalar s1 = cvGet2D(combineshapevectors[i],0,j);
                p+= (negNewParam4[i] * s1.val[0]);
            }

            CvScalar t;
            t.val[0] = s2.val[0] + p;
            cvSet2D(destShapewithoutQ,0,j,t);
        }
        cvSub(destShapewithoutQ,meanShape,destShapeTemp);
        for (int i=4;i<(nS+4);i++)
        {
            double p=cvDotProduct(combineshapevectors[i],destShapeTemp);
            negNewParamnS[i]=-1*p;
            ParamnS[i]=p;
        }
        for (int i=4;i<nS+4;i++)
        {
            param[i] =ParamnS[i];
        }
        for (int i=0;i<4;i++)
        {
            param[i] =Param4[i];
        }
//        printf(" -------------- \n");
     for (int i=0;i<nS+4;i++)
        {
if(i>3)
{
 CvScalar s;
 s= cvGet2D(eigenVal,0,i-4);
// printf("%e \n",s.val[0]);
 if(param[i]>((.7)*sqrt(s.val[0])))
 param[i]=((.7)*sqrt(s.val[0]));

 if(param[i]<((-.7)*sqrt(s.val[0])))
 param[i]=((-.7)*sqrt(s.val[0]));



}
//         printf("param %e \n",param[i]);
        }

                timer = (double)cvGetTickCount() - timer;
        printf( " Current Estimate = %gms\n", timer/((double)cvGetTickFrequency()*1000.) );

    return totalerror;

}