Exemplo n.º 1
0
void display()
{
    if(g_clear) {
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glFlush();
        g_clear = false;
        return;
    }
 
    clearScreen();

    switch(g_drawTypeState) {
        case STATE_DRAW_TRIANGLES:
            drawAllTriangles();
            break;

        case STATE_DRAW_SQUARES:
            drawAllSquares();
            break;

        case STATE_DRAW_HEXAGONS:
            drawAllHexagons();
            break;

        default:
            assert(!"INVALID INPUT DATA");
            break;
    }
    glFlush();
}
Exemplo n.º 2
0
void getMeanIm(vector<vector<Mat> > &affinesToMean, vector<Mat> &meanIms, Mat &meanOfAll)
{
    // get meanTriangles
    // warp all images to meanTriangles mesh
    // mean image = average of warped-to-mean images
    
    // get meanTriangles
    //vector<vector<Mat> > affinesToMean;
    vector<vector<vector<Point2f> > > oriTriangles;
    //vector<Mat> meanIms;
    Mat meanIm;
    Mat im0 = forMeanIms[0].clone();
    Mat im1 = forMeanIms[1];
    vector<vector<Point2f> > triangles0;
    vector<vector<Point2f> > triangles1;
    vector<Point2f> facepoints0 = meanFacePoints[0];
    vector<Point2f> facepoints1 = meanFacePoints[1];
    string name0 = "0"; string name1 = "1";
    delaunay2Faces(im0, im1, triangles0, triangles1, facepoints0, facepoints1, name0, name1);
    
    oriTriangles.push_back(triangles0);
    oriTriangles.push_back(triangles1);
    
    vector<vector<vector<Point2f> > > XtoYTriangles;
    getAllTriangles(triangles0, triangles1, XtoYTriangles);
    
    vector<vector<Point2f> > meanTriangles = XtoYTriangles[XtoYTriangles.size()/2];
//    drawAllTriangles(im0.clone(), meanTriangles, "see triangles");
//    vector<Mat> curAffines = getAllAffineTransforms(triangles0 , meanTriangles);
//    meanIm = warpImage(meanTriangles, im0.clone(), curAffines);
//    imshow("MEAN", meanIm);
//    meanIms.push_back(meanIm);
//    waitKey();
    for (int k = 2; k < forMeanIms.size(); k++)
    {
        im0 = meanIm;
        im1 = forMeanIms[k];
        vector<vector<Point2f> > triangles1;
        vector<Point2f> facepoints1 = meanFacePoints[k];
        replicateDelaunay(triangles0, triangles1, facepoints0, facepoints1);
        
        Mat triangulated = im1.clone();
        stringstream ss;
        ss << k;
        string ns = ss.str();
        string name(ns+"delau.jpg");
        drawAllTriangles(triangulated, triangles1, "cur delaunay replicated");
        imwrite(name, triangulated);
        //waitKey();
        
        oriTriangles.push_back(triangles1);
        
        vector<vector<vector<Point2f> > > XtoYTriangles;
        getAllTriangles(meanTriangles, triangles1, XtoYTriangles);
        
        meanTriangles = XtoYTriangles[XtoYTriangles.size()/2];
        
    }
    // warp all images to mean mesh (meanTriangles)
    for (int k = 0; k < forMeanIms.size(); k++)
    {
        vector<vector<Point2f> > curTriangles = oriTriangles[k];
        vector<Mat> curAffines = getAllAffineTransforms(curTriangles , meanTriangles);
        meanIm = warpImage(meanTriangles, forMeanIms[k].clone(), curAffines);
        stringstream ss;
        ss << k;
        string ns = ss.str();
        string name(ns+"_warpedToMean.jpg");
        cout << "done getting mean from " << k << "..." << endl;
        imshow(name, meanIm);
        imwrite(name, meanIm);
        meanIms.push_back(meanIm);
    }
    
    //Mat meanOfAll = meanIms[0].clone();
    meanOfAll = meanIms[0].clone();
    
    int numMeans = static_cast<int>(meanIms.size());
    for (int i = 0; i < meanOfAll.rows; i++)
    {
        for (int j =0; j < meanOfAll.cols; j++)
        {
            int B = 0, G = 0, R = 0;
            for (int k = 0; k < numMeans; k++)
            {
                B += meanIms[k].at<Vec3b>(i,j)[0];
                G += meanIms[k].at<Vec3b>(i,j)[1];
                R += meanIms[k].at<Vec3b>(i,j)[2];
            }
            B /= numMeans;
            if (B > 255) B = 255; // clamp
            G /= numMeans;
            if (G > 255) G = 255;
            R /= numMeans;
            if (R > 255) R = 255;
            
            meanOfAll.at<Vec3b>(i,j) = Vec3b(B, G, R);
        }
    }
    imshow("MEAN of all MEANS", meanOfAll);
    imwrite("MEAN_img.jpg", meanOfAll);
    cout << "Finished getting mean. Press ANY key to continue..." << endl;
    waitKey();
}