Exemplo n.º 1
0
int arMatrixPCA2( ARMat *input, ARMat *evec, ARVec *ev )
{
    ARMat   *work;
/*    ARdouble  srow;   */
    ARdouble  sum;
    int     row, clm;
    int     check, rval;
    int     i;

    row = input->row;
    clm = input->clm;
    check = (row < clm)? row: clm;
    if( row < 2 || clm < 2 ) return(-1);
    if( evec->clm != input->clm || evec->row != check ) return(-1);
    if( ev->clm   != check )      return(-1);

    work = arMatrixAllocDup( input );
    if( work == NULL ) return -1;

/*
    srow = sqrt((ARdouble)row);
    for(i=0; i<row*clm; i++) work->m[i] /= srow;
*/

    rval = PCA( work, evec, ev );
    arMatrixFree( work );

    sum = 0.0;
    for( i = 0; i < ev->clm; i++ ) sum += ev->v[i];
    for( i = 0; i < ev->clm; i++ ) ev->v[i] /= sum;

    return( rval );
}
Exemplo n.º 2
0
 int
Tracker::arMatrixPCA2( ARMat *input, ARMat *evec, ARVec *ev )
{
    ARMat   *work;
    // ARFloat  srow; // unreferenced
    ARFloat  sum;
    int     row, clm;
    int     check, rval;
    int     i;

    row = input->row;
    clm = input->clm;
    check = (row < clm)? row: clm;
    if( row < 2 || clm < 2 ) return(-1);
    if( evec->clm != input->clm || evec->row != check ) return(-1);
    if( ev->clm   != check )      return(-1);

    work = Matrix::allocDup( input );
    if( work == NULL ) return -1;

/*
    srow = sqrt((ARFloat)row);
    for(i=0; i<row*clm; i++) work->m[i] /= srow;
*/

    rval = PCA( work, evec, ev );
    Matrix::free( work );

    sum = 0.0;
    for( i = 0; i < ev->clm; i++ ) sum += ev->v[i];
    for( i = 0; i < ev->clm; i++ ) ev->v[i] /= sum;

    return( rval );
}
Exemplo n.º 3
0
void test3()
{
  matrix *m; /* Data matrix */
  PCAMODEL *model;
  int run = SIGSCIENTIFICRUN;

  NewMatrix(&m, 10, 2);


  m->data[0][0] = 2.2;  m->data[0][1] = 3.3;
  m->data[1][0] = 2.9;  m->data[1][1] = 4.5;
  m->data[2][0] = 4.0;  m->data[2][1] = 3.5;
  m->data[3][0] = 4.500;  m->data[3][1] = 4.7;
  m->data[4][0] = 5.1;  m->data[4][1] = 6.0;
  m->data[5][0] = 5.5;  m->data[5][1] = 4.5;
  m->data[6][0] = 6.5000;  m->data[6][1] = 6.4;
  m->data[7][0] = 7.2;  m->data[7][1] = 6.2;
  m->data[8][0] = 8.8;  m->data[8][1] = 3.9;
  m->data[9][0] = 10;  m->data[9][1] = 6.2;


  NewPCAModel(&model);

  printf("Test PCA 3\n");
  PCA(m, 1, 5, model, &run);

  PrintPCA(model);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Exemplo n.º 4
0
int matrixPCAnoMean( Mat input, Mat evec, Vec ev )
{
    Mat     work;
    double  srow, sum;
    int     row, clm;
    int     check, rval;
    int     i;

    row = input.row;
    clm = input.clm;
    check = (row < clm)? row: clm;
    if( row < 2 || clm < 2 ) return(-1);
    if( evec.clm != input.clm || evec.row != check ) return(-1);
    if( ev.clm   != check )     return(-1);

    work = matrixAllocDup( input );
    if( work.row != row || work.clm != clm ) return(-1);

    srow = sqrt((double)row);
    for(i=0; i<row*clm; i++) work.m[i] /= srow;

    rval = PCA( work, evec, ev );
    matrixFree( work );

    sum = 0.0;
    for( i = 0; i < ev.clm; i++ ) sum += ev.v[i];
    for( i = 0; i < ev.clm; i++ ) ev.v[i] /= sum;

    return( rval );
}
Exemplo n.º 5
0
/**
 * @author     	JIA Pei
 * @version    	2010-02-07
 * @brief      	build point model
 * @param      	allAlignedShapes			Input - input aligned points.
 * @return		void
*/
void VO_Point2DDistributionModel::VO_BuildPointDistributionModel( const vector<VO_Shape>& allAlignedShapes )
{
    unsigned int NbOfSamples 				= allAlignedShapes.size();
    unsigned int NbOfPoints					= allAlignedShapes[0].GetNbOfPoints();
    this->m_VONormalizedEllipses.resize(NbOfPoints);
    Mat_<float> matAlignedPoints			= Mat_<float>::zeros(NbOfSamples, 2);
    Mat_<float> matAlignedMeanPoint			= Mat_<float>::zeros(1, 2);

    for(unsigned int i = 0; i < NbOfPoints; ++i)
    {
        for(unsigned int j = 0; j < NbOfSamples; ++j)
        {
            matAlignedPoints(j, 0)				= allAlignedShapes[j].GetA2DPoint(i).x;
            matAlignedPoints(j, 1)				= allAlignedShapes[j].GetA2DPoint(i).y;
        }
        PCA pca = PCA(matAlignedPoints, matAlignedMeanPoint, CV_PCA_DATA_AS_ROW, 2);
        float xx = pca.eigenvectors.at<float>(0,0);
        float yy = pca.eigenvectors.at<float>(0,1);
        float theta = 0.0;
        if( fabs(xx) < FLT_MIN )	theta = (float)(CV_PI/2.0);
        else theta = atan(yy/xx)/CV_PI*180.0;
        Point2f pt = Point2f(	pca.mean.at<float>(0,0),
                                pca.mean.at<float>(0,1));
        this->m_VONormalizedEllipses[i] = VO_Ellipse(	pt,
                                          3.0*sqrt(pca.eigenvalues.at<float>(0,0)),
                                          3.0*sqrt(pca.eigenvalues.at<float>(1,0)),
                                          0,
                                          360,
                                          theta );
    }
}
Exemplo n.º 6
0
void AAM::makeShapeModel()
{
    shapePCA=PCA(shapeSet, Mat(), CV_PCA_DATA_AS_ROW);
    meanShape=shapePCA.mean;
    meanShape.convertTo(meanShape, CV_32S);
    this->deltaS=this->countVariationMatrix(shapeSet, meanShape);
    cout<<"shape set"<<shapeSet.type()<<endl;
   cout<<"mean shape: "<<meanShape<<endl;
}
Exemplo n.º 7
0
int main()
{
    CvMat* Vector = cvCreateMat(ROW, COL, CV_32FC1);
    cvSetData(Vector , Coordinates, Vector->step);

    Image = cvCreateImage(cvSize(450, 450),8,3);
    cvSet(Image, cvScalarAll(255), NULL);
    Image->origin = 1;

    PCA(Vector);

    cvNamedWindow("Image" , 0);
    cvShowImage("Image" , Image);
    cvWaitKey(0);
    return 0;
}
Exemplo n.º 8
0
 int
Tracker::arMatrixPCA(ARMat *input, ARMat *evec, ARVec *ev, ARVec *mean)
{
    ARMat     *work;
    ARFloat  srow, sum;
    int     row, clm;
    int     check, rval;
    int     i;

    row = input->row;
    clm = input->clm;
    check = (row < clm)? row: clm;
    if( row < 2 || clm < 2 ) return(-1);
    if( evec->clm != input->clm || evec->row != check ) return(-1);
    if( ev->clm   != check )      return(-1);
    if( mean->clm != input->clm ) return(-1);

    work = Matrix::allocDup( input );
    if( work == NULL ) return -1;

    srow = (ARFloat)sqrt((ARFloat)row);
    if( EX( work, mean ) < 0 ) {
        Matrix::free( work );
        return(-1);
    }
    if( CENTER( work, mean ) < 0 ) {
        Matrix::free( work );
        return(-1);
    }
    for(i=0; i<row*clm; i++) work->m[i] /= srow;

    rval = PCA( work, evec, ev );
    Matrix::free( work );

    sum = 0.0;
    for( i = 0; i < ev->clm; i++ ) sum += ev->v[i];
    for( i = 0; i < ev->clm; i++ ) ev->v[i] /= sum;

    return( rval );
}
Exemplo n.º 9
0
void test4()
{
  matrix *m; /* Data matrix */
  PCAMODEL *model;
  int run = SIGSCIENTIFICRUN;
  NewMatrix(&m, 3, 2);

  setMatrixValue(m, 0, 0, 0.424264);  setMatrixValue(m, 0, 1, 0.565685);
  setMatrixValue(m, 1, 0, 0.565685);  setMatrixValue(m, 1, 1, 0.424264);
  setMatrixValue(m, 2, 0, 0.707101);  setMatrixValue(m, 2, 1, 0.707101);

  NewPCAModel(&model);


  printf("Test PCA 4\n");
  PCA(m, 1, 5, model, &run);

  PrintPCA(model);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Exemplo n.º 10
0
void test5()
{
  matrix *m; /* Data matrix */
  PCAMODEL *model;

  NewMatrix(&m, 3, 4);

  setMatrixValue(m, 0, 0, 0.424264);  setMatrixValue(m, 0, 1, 0.565685);  setMatrixValue(m, 0, 2, 0.565685);  setMatrixValue(m, 0, 3, 0.424264);
  setMatrixValue(m, 1, 0, 0.565685);  setMatrixValue(m, 1, 1, 0.424264);  setMatrixValue(m, 1, 2, 0.424264);  setMatrixValue(m, 1, 3, 0.565685);
  setMatrixValue(m, 2, 0, 0.707101);  setMatrixValue(m, 2, 1, 0.707101);  setMatrixValue(m, 2, 2, 0.707101);  setMatrixValue(m, 2, 3, 0.707101);


  NewPCAModel(&model);

  printf("Test PCA 5\n");
  PCA(m, 1, 5, model, NULL);

  PrintPCA(model);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Exemplo n.º 11
0
void test6()
{
  matrix *m;
  PCAMODEL *model;

  NewMatrix(&m, 3,3);

  m->data[0][0] = 7; m->data[0][1] = 4; m->data[0][2] = 4;
  m->data[1][0] = 4; m->data[1][1] = 4; m->data[1][2] = 4;
  m->data[2][0] = 1; m->data[2][1] = 4; m->data[2][2] = 7;

  PrintMatrix(m);

  NewPCAModel(&model);

  PCA(m, 0, 5, model, NULL);

  PrintPCA(model);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Exemplo n.º 12
0
void PcaReductor::trainPca(SuperVectors superVectors)
{
	assert(superVectors.size() > 0);

	int numSuperVectors = superVectors.size();
	int sizeSuperVector = getSuperVectorSize(superVectors);
	// REDUCE BEFORE PCA
	int reducedSize = sizeSuperVector / REDUCE_SUPER_VECTOR_FACTOR;
	//

	Mat matrixOfSuperVectors(reducedSize, numSuperVectors, superVectors[0].type());
	for (int i = 0; i < numSuperVectors; i++) {
		// REDUCE BEFORE PCA
		SuperVector temp = superVectors[i].clone();
		temp.resize(reducedSize, 1);
		// 

		temp.convertTo(matrixOfSuperVectors.col(i), matrixOfSuperVectors.type());
	}

	pca_ = PCA(matrixOfSuperVectors, Mat(), CV_PCA_DATA_AS_COL);
}
Exemplo n.º 13
0
void test7()
{
  matrix *m;
  PCAMODEL *model;

  int nobj = 200;
  int nvars = 32000;
  NewMatrix(&m, nobj, nvars);

  srand(nobj);
  for(size_t i = 0; i < nobj; i++){
    for(size_t j = 0; j < nvars; j++){
      m->data[i][j] = randDouble(0,20);
    }
  }

  NewPCAModel(&model);

  PCA(m, 1, 5, model, NULL);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Exemplo n.º 14
0
void test1()
{
  matrix *m; /* Data matrix */
  PCAMODEL *model;
  int run = SIGSCIENTIFICRUN;

  NewMatrix(&m, 14, 7);


  m->data[0][0] = 4.0000;  m->data[0][1] = 4.0000;  m->data[0][2] = 1.0000;  m->data[0][3] = 84.1400;  m->data[0][4] = 1.0500;  m->data[0][5] = 235.1500;  m->data[0][6] = 357.1500;
  m->data[1][0] = 5.0000;  m->data[1][1] = 5.0000;  m->data[1][2] = 1.0000;  m->data[1][3] = 79.1000;  m->data[1][4] = 0.9780;  m->data[1][5] = 1.5090;  m->data[1][6] = 231.0000;
  m->data[2][0] = 4.0000;  m->data[2][1] = 5.0000;  m->data[2][2] = 1.0000;  m->data[2][3] = 67.0900;  m->data[2][4] = 0.9700;  m->data[2][5] = 249.0000;  m->data[2][6] = 403.0000;
  m->data[3][0] = 4.0000;  m->data[3][1] = 4.0000;  m->data[3][2] = 1.0000;  m->data[3][3] = 68.0700;  m->data[3][4] = 0.9360;  m->data[3][5] = 187.3500;  m->data[3][6] = 304.5500;
  m->data[4][0] = 3.0000;  m->data[4][1] = 4.0000;  m->data[4][2] = 2.0000;  m->data[4][3] = 68.0800;  m->data[4][4] = 1.0300;  m->data[4][5] = 363.0000;  m->data[4][6] = 529.0000;
  m->data[5][0] = 9.0000;  m->data[5][1] = 7.0000;  m->data[5][2] = 1.0000;  m->data[5][3] = 129.1600;  m->data[5][4] = 1.0900;  m->data[5][5] = 258.0000;  m->data[5][6] = 510.0000;
  m->data[6][0] = 10.0000;  m->data[6][1] = 8.0000;  m->data[6][2] = 0.0000;  m->data[6][3] = 128.1600;  m->data[6][4] = 1.1500;  m->data[6][5] = 352.0000;  m->data[6][6] = 491.0000;
  m->data[7][0] = 6.0000;  m->data[7][1] = 6.0000;  m->data[7][2] = 0.0000;  m->data[7][3] = 78.1118;  m->data[7][4] = 0.8765;  m->data[7][5] = 278.6400;  m->data[7][6] = 353.3000;
  m->data[8][0] = 16.0000;  m->data[8][1] = 10.0000;  m->data[8][2] = 0.0000;  m->data[8][3] = 202.2550;  m->data[8][4] = 1.2710;  m->data[8][5] = 429.1500;  m->data[8][6] = 666.6500;
  m->data[9][0] = 6.0000;  m->data[9][1] = 12.0000;  m->data[9][2] = 0.0000;  m->data[9][3] = 84.1600;  m->data[9][4] = 0.7800;  m->data[9][5] = 279.0000;  m->data[9][6] = 354.0000;
  m->data[10][0] = 4.0000;  m->data[10][1] = 8.0000;  m->data[10][2] = 1.0000;  m->data[10][3] = 72.1100;  m->data[10][4] = 0.8900;  m->data[10][5] = 164.5000;  m->data[10][6] = 339.0000;
  m->data[11][0] = 4.0000;  m->data[11][1] = 9.0000;  m->data[11][2] = 1.0000;  m->data[11][3] = 71.1100;  m->data[11][4] = 0.8660;  m->data[11][5] = 210.0000;  m->data[11][6] = 360.0000;
  m->data[12][0] = 5.0000;  m->data[12][1] = 11.0000;  m->data[12][2] = 1.0000;  m->data[12][3] = 85.1500;  m->data[12][4] = 0.8620;  m->data[12][5] = 266.0000;  m->data[12][6] = 379.0000;
  m->data[13][0] = 5.0000;  m->data[13][1] = 10.0000;  m->data[13][2] = 1.0000;  m->data[13][3] = 86.1300;  m->data[13][4] = 0.8800;  m->data[13][5] = 228.0000;  m->data[13][6] = 361.0000;


  NewPCAModel(&model);


  printf("Test PCA 1\n");
  PCA(m, 1, 5, model, &run);

  PrintPCA(model);

  DelPCAModel(&model);
  DelMatrix(&m);
}
Exemplo n.º 15
0
/* Function: mesh
 * 
 * Description: Reads in 3D feature points, contours, and camera coefficients 
 *     from file. Converts the 3D feature points to PCA space, creates a thin
 *     plate spline over a 3D grid, and converts the mesh back to the original
 *     space. Using the camera coefficients to project the points of the mesh
 *     to 2D, we then set only points that lie within the input contours as
 *     valid. The resulting valid mesh points are then outputed to file for each
 *     input contour.
 * 
 * Parameters:
 *     features3DFilename: filename of the 3D features
 *     contoursFilename: filename of the vertices for each contour
 *     cameraCoefficientsFilename: filename of the camera coefficients
 *     meshPointsFilenames: filenames of the files to write each contour mesh
 *         points to
 *     numMeshFiles: number of mesh point files (must be same as number of contours)
 *     regularization: smoothing parameter for the TPS calculations
 *     errorMessage: string to output an error message to, on error
 * 
 * Returns: 0 on success, 1 on error.
 */
int mesh(
    _In_ char *features3DFilename,
    _In_ char *contoursFilename, 
    _In_ char *cameraCoefficientsFilename,
    _In_ char **meshPointsFilenames,
    _In_ int numMeshFiles,
    _In_ double regularization,
    _Out_ char *errorMessage)
{    
    // variable to store error status returned from functions
    int status;
    
    int numContours;
    CvPoint3D32f **features3D;    
    int *numFeaturesInContours;
    
    // read the input triangulated 3D features from file
    status = read3DFeaturesFromInputFile(&features3D, &numFeaturesInContours, &numContours, features3DFilename);
    
    if (status == INPUT_FILE_OPEN_ERROR)
    {
        sprintf(errorMessage, "Could not open 3D features file.");
        return 1;
    }
    
    if (status == INVALID_NUM_CONTOURS_ERROR)
    {
        sprintf(errorMessage, "At least 1 contour region required.");
        return 1;
    }
    
    if (status == INCORRECT_INPUT_FILE_FORMAT_ERROR)
    {
        sprintf(errorMessage, "3D features file has incorrect format.");
        return 1;
    } 
    
    if (status == OUT_OF_MEMORY_ERROR)
    {
        sprintf(errorMessage, "Out of memory error.");
        return 1;
    }
    
    if (numContours != numMeshFiles)
    {
        sprintf(errorMessage, "Number of contours passed into function and read in from 3D features file must match.");
        return 1;
    }
    
    CvSeq* contours;
    CvMemStorage *contourStorage = cvCreateMemStorage(0);
        
    if (contourStorage == NULL)
    {
        sprintf(errorMessage, "Out of memory error.");
        return 1;
    }
    
    int numContoursFromContourFile;
    
    // read the input region of interest contours from file
    status = readContourVerticesFromInputFile(&contours, contourStorage, &numContoursFromContourFile, contoursFilename);
    
    if (status == INPUT_FILE_OPEN_ERROR)
    {
        sprintf(errorMessage, "Could not open contour vertices file.");
        return 1;
    }
    
    if (status == INCORRECT_INPUT_FILE_FORMAT_ERROR)
    {
        sprintf(errorMessage, "Contour vertices file has incorrect format.");
        return 1;
    }
    
    if (numContours != numContoursFromContourFile)
    {
        sprintf(errorMessage, "Number of contours in contour vertices file and 3D features file must match.");
        return 1;
    }
    
    double **cameraCoefficients;
    int numCameras;
    
    // get the number of cameras and 11 camera coefficients for each camera from 
    // file
    status = readCoefficientsFromInputFile(&cameraCoefficients, &numCameras, cameraCoefficientsFilename);
    
    if (status == INPUT_FILE_OPEN_ERROR)
    {
        sprintf(errorMessage, "Could not open camera coefficients file.");
        return 1;
    }
    
    if (status == INCORRECT_INPUT_FILE_FORMAT_ERROR)
    {
        sprintf(errorMessage, "Camera coefficients file has incorrect format.");
        return 1;
    }
    
    if (status == INCORRECT_NUM_CAMERAS_ERROR)
    {
        sprintf(errorMessage, "At least 2 cameras are required for triangulation.");
        return 1;
    }    
    
    if (status == OUT_OF_MEMORY_ERROR)
    {
        sprintf(errorMessage, "Out of memory error.");
        return 1;
    }
    
    CvPoint3D32f **features3DGrid = (CvPoint3D32f **)malloc(numContours * sizeof(CvPoint3D32f *));
    char **validFeatureIndicator = (char **)malloc(numContours * sizeof(char *));    
    
    if (features3DGrid == NULL || validFeatureIndicator == NULL)
    {
        sprintf(errorMessage, "Out of memory error.");
        return 1;
    }
    
    int *numGridPoints = (int *)malloc(numContours * sizeof(int));
    int *numGridPointsInContours = (int *)malloc(numContours * sizeof(int));

    if (numGridPoints == NULL || numGridPointsInContours == NULL)
    {
        sprintf(errorMessage, "Out of memory error.");
        return 1;
    }
    
    CvSeq *contour = contours;
    int k = 0;
    
    // for each contour, calculate the TPS for the feature points
    while (contour)
    {        
        CvPoint3D32f *features3DPrime = (CvPoint3D32f *)malloc(numFeaturesInContours[k] * sizeof(CvPoint3D32f));    
        Data PCAData;
        
        if (createPCA(&PCAData, 3, numFeaturesInContours[k]) == OUT_OF_MEMORY_ERROR)
        {
            sprintf(errorMessage, "Out of memory error.");
            return 1;
        }
        
        // convert the input points to PCA space, and store in features3DPrime
        status = PCA(features3DPrime, features3D[k], numFeaturesInContours[k], &PCAData);
        
        if (status == OUT_OF_MEMORY_ERROR)
        {
            sprintf(errorMessage, "Out of memory error.");
            return 1;
        }
        
        double xPrimeMax, yPrimeMax, xPrimeMin, yPrimeMin;
        
        // get the max and min x and y values of features3DPrime, so that we can create
        // a grid of appropriate size that will encompass the features
        getXPrimeYPrimeMaxMin(features3DPrime, numFeaturesInContours[k], &xPrimeMax, &yPrimeMax, &xPrimeMin, &yPrimeMin);
        
        // multiply the ranges of x and y by 3 to create grid size
        int gridWidth = (int) ((xPrimeMax - xPrimeMin) * 3);
        int gridHeight = (int) ((yPrimeMax - yPrimeMin) * 3);
        
        double **grid = (double **)malloc(gridWidth * sizeof(double *));
        
        if (grid == NULL)
        {
            sprintf(errorMessage, "Out of memory error.");
            return 1;
        }
        
        for (int i = 0; i < gridWidth; i++)
        {
            grid[i] = (double *)malloc(gridHeight * sizeof(double));
            
            if (grid[i] == NULL)
            {
                sprintf(errorMessage, "Out of memory error.");
                return 1;
            }
        }
        
        // since the grid row and column indices start at 0 because it is an array,
        // but the actual x and y start values do not necessarily start 0, we find
        // the actual start values of x and y. This is the middle point between max
        // and min of x or y, minus half the width or height of the grid
        int gridWidthStartIndex = (int)(((xPrimeMax + xPrimeMin)/2) - (gridWidth/2));
        int gridHeightStartIndex = (int)(((yPrimeMax + yPrimeMin)/2) - (gridHeight/2));
        
        // perform thin plate spline calculations to find the smoothed z coordinates
        // for every point in the grid
        status = TPS(features3DPrime, numFeaturesInContours[k], grid, gridHeight, gridWidth, gridHeightStartIndex, gridWidthStartIndex, regularization);
        
        if (status == NOT_ENOUGH_POINTS_ERROR)
        {
            sprintf(errorMessage, "At least 3 valid feature points are required to define a plane for thin sheet spline function.");
            return 1;
        }
        
        if (status == OUT_OF_MEMORY_ERROR)
        {
            sprintf(errorMessage, "Out of memory error.");
            return 1;
        }
        
        numGridPoints[k] = gridHeight * gridWidth;
        
        CvPoint3D32f *features3DGridPrime = (CvPoint3D32f *)malloc(numGridPoints[k] * sizeof(CvPoint3D32f));
        features3DGrid[k] = (CvPoint3D32f *)malloc(numGridPoints[k] * sizeof(CvPoint3D32f));
        
        if (features3DGridPrime == NULL || features3DGrid[k] == NULL)
        {
            sprintf(errorMessage, "Out of memory error.");
            return 1;
        }
        
        // transform the grid to CvPoint3D32f points
        for (int i = 0; i < gridWidth; i++)
        {
            for (int j = 0; j < gridHeight; j++)
            {            
                int curIndex = gridWidth*j + i;
                
                features3DGridPrime[curIndex].x = (double) i+gridWidthStartIndex;
                features3DGridPrime[curIndex].y = (double) j+gridHeightStartIndex;
                features3DGridPrime[curIndex].z = grid[i][j];
            }
        }
        
        // convert the grid points from PCA space back to original space, and store
        // the points in CvPoint3D32f array features3DGrid
        status = reversePCA(features3DGrid[k], features3DGridPrime, numGridPoints[k], &PCAData);
        
        if (status == OUT_OF_MEMORY_ERROR)
        {
            sprintf(errorMessage, "Out of memory error.");
            return 1; 
        }
        
        CvPoint2D32f *idealFeatures2D = (CvPoint2D32f *)malloc(numGridPoints[k] * sizeof(CvPoint2D32f));
        
        if (idealFeatures2D == NULL)
        {
            sprintf(errorMessage, "Out of memory error.");
            return 1;
        }    
        
        // project the 3d grid points to 2D space
        calculateIdealFeatures(idealFeatures2D, features3DGrid[k], numGridPoints[k], cameraCoefficients[0]);
        
        validFeatureIndicator[k] = (char *)malloc(numGridPoints[k] * sizeof(char));
        
        if (validFeatureIndicator[k] == NULL)
        {
            sprintf(errorMessage, "Out of memory error.");
            return 1;
        }
        
        // test each 2d grid point to see if it lies within the input contours, and
        // set the correspoinding values of validFeatureIndicator accordingly
        numGridPointsInContours[k] = areFeaturesInContour(idealFeatures2D, numGridPoints[k], validFeatureIndicator[k], contour);
        
        contour = (CvSeq *)(contour->h_next);
        k++;
        
        free(features3DPrime);
        destroyPCA(&PCAData);
    
        for (int i = 0; i < gridWidth; i++)
        {
            free(grid[i]);
        }
    
        free(grid);
        free(features3DGridPrime);
        free(idealFeatures2D);        
    }    
    
    // print the valid 3D mesh points to files for each contour
    writeGridPointsToFile(meshPointsFilenames, features3DGrid, numGridPoints, validFeatureIndicator, numGridPointsInContours, numContours);     
    
    // cleanup
    for (int i = 0; i < numContours; i++)
    {
        free(features3D[i]);
        free(features3DGrid[i]);
        free(validFeatureIndicator[i]);
    }
    
    free(features3D);    
    free(features3DGrid);    
    free(validFeatureIndicator);
    free(numGridPoints);
    free(numGridPointsInContours);
    
    cvReleaseMemStorage(&contourStorage);
    
    for (int i = 0; i < numCameras; i++)
    {
        free(cameraCoefficients[i]);
    }
    
    free(cameraCoefficients);
               
    return 0;
}
Exemplo n.º 16
0
hsVectorStream* plPhysXCooking::IMakePolytope(const plMaxMeshExtractor::NeutralMesh& inMesh)
{
    hsBool success=0;
    std::vector<hsPoint3> outCloud;
    hsPoint3 offset;
    int numPlanes=26;
    float planeMax[26];
    int indexMax[26];
    hsPoint3 AABBMin(FLT_MAX,FLT_MAX,FLT_MAX);
    hsPoint3 AABBMax(-FLT_MAX,-FLT_MAX,-FLT_MAX);
    //prep
    NxVec3* vectors = new NxVec3[26];
    
    int curvec=0;
    for(int xcomp= -1;xcomp<2;xcomp++)
    {
        for(int ycomp= -1;ycomp<2;ycomp++)
        {
            for(int zcomp= -1;zcomp<2;zcomp++)
            {
                if(!((xcomp==0)&&(ycomp==0)&&(zcomp==0)))
                {
                    vectors[curvec].set((float)(xcomp),(float)(ycomp),(float)(zcomp));
                    vectors[curvec].normalize();
                    planeMax[curvec]=(-FLT_MAX);
                    //indexMax[curvec]=0;
                    curvec++;
                }
            }
        }
    }
    /*
    for(int i=0;i<26;i++)
    {//make your max and mins
        planeMax[i]=(-FLT_MAX);
    }
    */
    hsPoint3 centroid(0.0f,0.0f,0.0f);
    for(int i=0;i<inMesh.fNumVerts;i++) centroid+=inMesh.fVerts[i];
    centroid=centroid/(float)inMesh.fNumVerts;
    //temp
    NxVec3* nxLocs=new NxVec3[inMesh.fNumVerts];
    NxVec3* nxLocs2=new NxVec3[inMesh.fNumVerts];
    for(int i=0;i<inMesh.fNumVerts;i++)
    {
        hsPoint3 temppt=inMesh.fVerts[i] - centroid;
        nxLocs[i]=plPXConvert::Point(temppt);
    }
    NxMat33 rot;
    NxVec3 eigen;
    PCA(nxLocs,inMesh.fNumVerts,rot);
    NxMat33 invrot;
    rot.getInverse(invrot);
    for(int i=0; i<inMesh.fNumVerts;i++)
    {
        nxLocs2[i]=invrot*nxLocs[i];
    }
    for(int i=0;i<inMesh.fNumVerts;i++)
    {
        for(int plane=0;plane<26;plane++)
        {
            float dist=nxLocs2[i].dot(vectors[plane]);
            if(dist>=planeMax[plane])
            {
                planeMax[plane]=dist;
                indexMax[plane]=i;
            }
        }
    }
    for(int i=0;i<inMesh.fNumVerts;i++)
    {
        AABBMin.fX = hsMinimum(nxLocs2[i].x, AABBMin.fX);
        AABBMin.fY = hsMinimum(nxLocs2[i].y, AABBMin.fY);
        AABBMin.fZ = hsMinimum(nxLocs2[i].z, AABBMin.fZ);
        AABBMax.fX = hsMaximum(nxLocs2[i].x, AABBMax.fX);
        AABBMax.fY = hsMaximum(nxLocs2[i].y, AABBMax.fY);
        AABBMax.fZ = hsMaximum(nxLocs2[i].z, AABBMax.fZ);
    }
    
    int resultingPoints=0;
    for(int i=0;i<26;i++)
    {
        for(int j=0;j<26;j++)
        {
            for(int k=0;k<26;k++)
            {   
                NxVec3 res;
                if(ThreePlaneIntersect(vectors[i],nxLocs2[indexMax[i]],vectors[j],nxLocs2[indexMax[j]], vectors[k],nxLocs2[indexMax[k]],res))
                {
                    //check it is within all slabs
                    bool within=true;
                    int curplane=0;
                    do
                    {
                        float intersecdist=res.dot(vectors[curplane]);
                        if((intersecdist-planeMax[curplane])>0.0001)

                        {
                            within=false;
                    
                        }
                        curplane++;
                    }
                    while((curplane<26)&&within);
                    if(within)
//                  if((res.x>=AABBMin.fX)&&(res.x<=AABBMax.fX)&&
//                      (res.y>=AABBMin.fY)&&(res.y<=AABBMax.fY)&&
//                      (res.z>=AABBMin.fZ)&&(res.z<=AABBMax.fZ))
                    {
                        NxVec3 reverted;
                        reverted=rot*res;
                        reverted.x=reverted.x +centroid.fX;
                        reverted.y=reverted.y +centroid.fY;
                        reverted.z=reverted.z +centroid.fZ;
                        hsPoint3 out;
                        out=plPXConvert::Point(reverted);
                        outCloud.push_back(out);
                    }
                }
            }
        }
    }
    
    //planes discovered
    //this is'nt  right
    //cleanup
    offset=centroid;

    delete[] vectors;
        hsPoint3* pointages=new hsPoint3[outCloud.size()];
    for(int x=0;x<outCloud.size();x++)pointages[x]=outCloud[x];
    hsVectorStream* vectorstrm;
    vectorstrm= CookHull(outCloud.size(),pointages,true);
    delete[] pointages; 
    delete[] nxLocs;
    delete[] nxLocs2;
    return vectorstrm;
}
Exemplo n.º 17
0
Arquivo: main.c Projeto: lorlor/DIPpro
int main(int argc, const char * argv[]) {
    int r_width=50,r_height=50;
    
    IplImage *src =cvLoadImage("/Users/Tony/DIPImage/lena.png", 0);
    
    int width=src->width, height=src->height;
    RGB * srcarry=(RGB *)malloc(sizeof(RGB)*width*height);
    double * srcarry_dbl=(double *)malloc(sizeof(double)*width*height);
    RGB * dst1arry=(RGB *)malloc(sizeof(RGB)*width*height);
    RGB * dst2arry=(RGB *)malloc(sizeof(RGB)*width*height);
    double * dst3arry=(double *)malloc(sizeof(double)*width*height);
    double * dst4arry=(double *)malloc(sizeof(double)*width*height);
    double * dst5arry=(double *)malloc(sizeof(double)*width*height);
    double * dst6arry=(double *)malloc(sizeof(double)*width*height/4);
    IplImage *dst1_r =cvCreateImage(cvSize(width, height), src->depth, 1);
    IplImage *dst1_g =cvCreateImage(cvSize(width, height), src->depth, 1);
    IplImage *dst1_b =cvCreateImage(cvSize(width, height), src->depth, 1);
    IplImage *dst1   =cvCreateImage(cvSize(width, height), src->depth, 3);
    IplImage *dst2_r =cvCreateImage(cvSize(width, height), src->depth, 1);
    IplImage *dst2_g =cvCreateImage(cvSize(width, height), src->depth, 1);
    IplImage *dst2_b =cvCreateImage(cvSize(width, height), src->depth, 1);
    IplImage *dst2 =cvCreateImage(cvSize(width, height), src->depth, 3);
    IplImage *dst3 =cvCreateImage(cvSize(width, height), src->depth, 1);
    IplImage *dst4 =cvCreateImage(cvSize(width, height), src->depth, 1);
    IplImage *dst5 =cvCreateImage(cvSize(width, height), src->depth, 1);
    IplImage *dst6 =cvCreateImage(cvSize(width/2, height/2), src->depth, 1);
    if(src->nChannels==3){
        for (int j=0;j<height; j++) {
            for(int i=0;i<width;i++){
                CvScalar s = cvGet2D(src,j,i);
                srcarry[j*width+i].c1=s.val[2];
                srcarry[j*width+i].c2=s.val[1];
                srcarry[j*width+i].c3=s.val[0];
            
            }
        }
    }else {
        for (int j=0;j<height; j++) {
            for(int i=0;i<width;i++){
                srcarry_dbl[j*width+i]=cvGetReal2D(src,j,i);
             
            }
        }
    }
    //double* dst1arry_r=(double *)malloc(sizeof(double)*width*height);
    //double* dst1arry_g=(double *)malloc(sizeof(double)*width*height);
    //double* dst1arry_b=(double *)malloc(sizeof(double)*width*height);
    //double* dst2arry_r=(double *)malloc(sizeof(double)*width*height);
    //double* dst2arry_g=(double *)malloc(sizeof(double)*width*height);
    //double* dst2arry_b=(double *)malloc(sizeof(double)*width*height);
    //SharpenRGB(srcarry, dst1arry, width, height, 1, SHARPEN_SOBEL);
    //RGB2HSI(srcarry, dst1arry, width, height);
    //SharpenHSI(dst1arry, dst1arry, width, height, 1, SHARPEN_SOBEL);
    //SmoothHSI(dst1arry, dst2arry, width, height, 5, 5, 0.8, 30, SMOOTH_MEAN);
    //HSI2RGB(dst2arry, dst1arry, width, height);
    //Zero(dst1arry_b, width, height);
    //RGB2sRGB(srcarry, dst1arry, width, height);
    //sRGB2RGB(dst1arry, dst2arry, width, height);
    //RGB skin_rgb;
    //skin_rgb.c1=185;
    //skin_rgb.c2=0;
    //skin_rgb.c3=0;
    //Resize(srcarry_dbl, width, height, dst6arry, width/2,height/2);
    //Position p;
    //p.x=20;
    //p.y=20;
    //InteImage(srcarry_dbl, dst3arry, width, height);
    //for(int j=0;j<height;j++){
    //    for(int i=0;i<width;i++){
    //        printf("%d ",(int)dst3arry[j*width+i]);
    //    }
    //    printf("\n");
    //}
    //matrixMultreal(dst3arry, dst3arry, 0.0000000001, width, height);
    //matrixCopyLocal(srcarry_dbl, dst6arry, width, height, width/2, height/2, &p);
    //printf("%d\n",isEVEN(3));
    //Resize(srcarry_dbl, 256, 256,dst6arry, 512, 512);
    //SIFT_Feature * sift=NULL;
    //Resize(srcarry_dbl, width, height, temp_src, width*2, height*2);
    //SIFT(srcarry_dbl,&sift, width, height, 5, 5);
    //SIFT_Feature *temp=sift;
    //while (temp!=NULL) {
    //    printf("x:%g\t y:%g\t scale:%g\t orientation:%g\t\n",temp->x,temp->y,temp->scale,temp->orientation);
    //    for(int i=0;i<128;i++)
     //       printf("%d \t",temp->des_vector[i]);
     //   printf("\n");
    //    temp=temp->next;
    //}
    //ReleaseSIFTlist(sift);
    //Position_DBL p;
    //p.x=5;
    //p.y=5;
    //matrixMulmatrix(srcarry_dbl, srcarry_dbl, dst3arry, width, height);
    double *dst_pca;
    double arry[12]={1,3,2,2,4,3,3,1,1,4,2,4};
    PCA(arry, 3, 4, &dst_pca, 4);
    //matrixCovariance(arry, dst_pca, 3, 4);
    for(int j=0;j<4;j++){
        for(int i=0;i<4;i++)
            printf("%10g\t",dst_pca[j*4+i]);
        printf("\n");
    }
    //matrixRotation(srcarry_dbl, dst3arry, width, height, width, height,45,&p);
    //double * space[5];
    //double * dog[4];
    //ScaleSpace(srcarry_dbl, space, width, height, 1.6, 5);
    //DOG_Scale(space, dog, width, height, 5);
    //dst3arry=dog[0];
    //printf("%lf\n",delta);
    //dst4arry=space[1];
    //matrixSub(dst4arry,dst3arry,dst5arry, width, height);
   // HistogramEqualization(dst3arry, dst3arry, width, height);
    //double distance=130;
    //SegmentRGB(srcarry, dst1arry, width, height, &skin_rgb, distance);
    //SmoothRGB(dst2arry,dst1arry, width, height, 15, 15, 2.4, 0, SMOOTH_GAUSSIAN);
    //Threshold_RGB(dst1arry, dst1arry, &threshold, width, height);
    //Cover_RGB(srcarry,dst2arry, dst1arry, width, height);
    //RGB2YIQ(srcarry , dst1arry, width, height);
    //Split(dst1arry, dst3arry, dst4arry, dst5arry, width, height);
    //Zero(dst4arry, width, height);
    //Gray2Color(srcarry_dbl, dst1arry, width, height,1);
    //RGB2HSV(srcarry, dst2arry, width, height);
    //Complementary_Color(dst2arry, dst2arry, width, height, COLOR_SPACE_HSV);
    //HSV2RGB(dst2arry, dst1arry, width, height);
    //HistEqualRGB(srcarry, dst2arry, width, height);
    //RGB2HSI(srcarry, dst1arry, width, height);
    //Split(dst1arry, dst3arry, dst4arry, dst5arry, width, height);
    //HSI2RGB(dst2arry, dst1arry, width, height);
    for (int j=0;j<height; j++) {
        for(int i=0;i<width;i++){
            cvSetReal2D(dst1_r, j, i,dst1arry[j*width+i].c3);
            cvSetReal2D(dst1_g, j, i,dst1arry[j*width+i].c2);
            cvSetReal2D(dst1_b, j, i,dst1arry[j*width+i].c1);
            
            
            
            cvSetReal2D(dst2_r, j, i,dst2arry[j*width+i].c3);
            cvSetReal2D(dst2_g, j, i,dst2arry[j*width+i].c2);
            cvSetReal2D(dst2_b, j, i,dst2arry[j*width+i].c1);
            
            
            cvSetReal2D(dst3, j, i,dst3arry[j*width+i]);
            cvSetReal2D(dst4, j, i,dst4arry[j*width+i]);
            cvSetReal2D(dst5, j, i,dst5arry[j*width+i]);
        }

    }
    for (int j=0;j<height/2; j++) {
        for(int i=0;i<width/2;i++){
            
            cvSetReal2D(dst6, j, i,dst6arry[j*(width/2)+i]);
        }
    
    }
    cvMerge(dst1_r, dst1_g, dst1_b, NULL, dst1);
    cvMerge(dst2_r, dst2_g, dst2_b, NULL, dst2);
    //cvSaveImage("/Users/Tony/DIPImage/sift_lena_90_dst.png", dst3, 0);
    //cvSaveImage("/Users/Tony/DIPImage/segment_RGB_ban1_dst.png", dst2, 0);
    //cvSaveImage("/Users/Tony/DIPImage/hough_edge3.jpg", dst2, 0);
    //printf("%lf",M_PI_2);
    //cvCanny(src, dst2, 200, 150,3);
    //Thinning(dst2, dst2);
    cvNamedWindow("src", 1);
    cvShowImage("src", src);
    
    cvNamedWindow("dst1", 1);
    cvShowImage("dst1", dst1);
    
    cvNamedWindow("dst2", 1);
    cvShowImage("dst2", dst2);
    
    cvNamedWindow("dst3", 1);
    cvShowImage("dst3", dst3);
    
    cvNamedWindow("dst4", 1);
    cvShowImage("dst4", dst4);
    
    cvNamedWindow("dst5", 1);
    cvShowImage("dst5", dst5);
    
    cvNamedWindow("dst6", 1);
    cvShowImage("dst6", dst6);
    
    cvWaitKey(0);
    free(srcarry);
    //ReleaseMatArr(space, 5);
    //ReleaseMatArr(dog, 4);
    return 0;
}
Exemplo n.º 18
0
void IRWPCA(const Matrix<double>& data,
	    Vector<double>& weights,
	    Vector<double>& mu,
	    Matrix<double>& trans,
	    const double tol/*=1E-8*/,
	    const int max_iter/*=1000*/,
	    const bool quiet/* = true*/)
{
  int d_in = data.nrows();
  int d_out = trans.nrows();
  int N = data.ncols();
  
  //check on input data
  if (mu.size() != d_in)
    mu.reallocate(d_in);

  if (trans.ncols() != d_in)
    trans.reallocate(d_out,d_in);
  
  if (weights.size() != N)
    weights.reallocate(N,1.0);
  else
    weights.SetAllTo(1.0);

  if (max_iter<1)
    throw MatVecError("max_iter must be positive");
  
  //data needed for procedure
  Matrix<double,SYM> transcov(d_in,d_in);
  Vector<double> V;
  Vector<double> weights_old;
  Vector<double> V_minus_mu;
  Matrix<double> trans_old;

  PCA(data,mu,trans);

  //Now we iterate and find the optimal weights,
  // mean, and transformation
  for(int count=1;count<max_iter;count++)
    {
      weights_old.deep_copy(weights);
      trans_old.deep_copy(trans);

      transcov = trans.Transpose() * trans;
      
      //find errors and new weights
      for(int i=0;i<N;i++)
	{
	  V.deep_copy( data.col(i) );
	  V -= mu;
	  V_minus_mu.deep_copy(V);
	  V -= transcov * V_minus_mu;
	  weights(i) = pow( blas_NRM2(V), 2 );
	}     
      
      make_weights(weights);
      WPCA(data,weights,mu,trans);
      
      //check for convergence using residuals between
      //  new weights and old weights
      weights_old -= weights;
      double Wres = blas_NRM2(weights_old);
      //  and new trans and old trans
      //trans_old -= trans;
      //double Tres = blas_NRM2(trans_old);
	
      if ( ( Wres/sqrt(N) <tol) )
	{
	  if (!quiet)
	    std::cout << "IRWPCA: converged to tol = " << tol 
		      << " in " << count << " iterations\n";
	  return;
	}
    }//end for

  //if tolerance was not reached, return an error message
  throw IterException(max_iter,tol);
}