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(); }
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(); }