bool ASM_Gaze_Tracker::calculatePupilCenter(){ Mat leftEyeImg,rightEyeImg,cropped; if (isTrackingSuccess == false) { return false; } canthusPts = vector<Point2f>(tracker.points.begin(),tracker.points.begin()+4); nosePts = vector<Point2f>(tracker.points.begin()+4,tracker.points.begin()+6); if (canthusPts[2].x < canthusPts[0].x && canthusPts[0].x < canthusPts[1].x && canthusPts[1].x < canthusPts[3].x) { } else { return false; } eyePairTileAngle = calculateEyePairTileAngle(canthusPts); glabellaPoint= caculateEyePairCenter(canthusPts); rotationMatrix = getRotationMatrix2D(glabellaPoint, eyePairTileAngle, 1.0); Mat Mback = getRotationMatrix2D(glabellaPoint, -eyePairTileAngle, 1.0); vector<Point2f> rotatedCanthusPts = rotatePointsByRotationMatrix(canthusPts, rotationMatrix); vector<Point2f> rotatedNosePts = rotatePointsByRotationMatrix(nosePts, rotationMatrix); float eyePairRectWidth =abs(rotatedCanthusPts[2].x - rotatedCanthusPts[3].x)+1; Size2f eyePairRectSize(eyePairRectWidth,eyePairRectWidth/7); Rect cropRect(Point2f(glabellaPoint.x-eyePairRectWidth/2,glabellaPoint.y -eyePairRectWidth/14.0f),eyePairRectSize); warpAffine(im, rotated_img, rotationMatrix, im.size(),CV_INTER_LINEAR); getRectSubPix(rotated_img, eyePairRectSize, glabellaPoint, cropped); Rect leftEyeRect = Rect(0,0,rotatedCanthusPts[0].x-rotatedCanthusPts[2].x,eyePairRectSize.height); Rect rightEyeRect = Rect(rotatedCanthusPts[1].x-rotatedCanthusPts[2].x,0,rotatedCanthusPts[3].x-rotatedCanthusPts[1].x,eyePairRectSize.height); if (leftEyeRect.area() < 50 || rightEyeRect.area()< 50) { return false; } Point2f leftEyeCenter, rightEyeCenter; // findEyeCenterByColorSegmentation(cropped(leftEyeRect), leftEyeCenter); // findEyeCenterByColorSegmentation(cropped(rightEyeRect), rightEyeCenter); // cout<<"debug"<<endl; boost::thread leftEyeThread(findEyeCenterByColorSegmentation, cropped(leftEyeRect), boost::ref(leftEyeCenter), 0.4,3,3,5); boost::thread rightEyeThread(findEyeCenterByColorSegmentation, cropped(rightEyeRect), boost::ref(rightEyeCenter), 0.4,3,3,5); leftEyeThread.join(); rightEyeThread.join(); leftEyeCenter += Point2f(leftEyeRect.tl().x,leftEyeRect.tl().y); leftEyeCenter += Point2f(cropRect.tl().x, cropRect.tl().y); rightEyeCenter += Point2f(rightEyeRect.tl().x,rightEyeRect.tl().y); rightEyeCenter += Point2f(cropRect.tl().x,cropRect.tl().y); leftEyePoint= rotatePointByRotationMatrix(leftEyeCenter, Mback); rightEyePoint= rotatePointByRotationMatrix(rightEyeCenter, Mback); isTrackingSuccess = true; return true; }
vector<Point2f> rotatePointsByRotationMatrix(const vector<Point2f>& original,const Mat& RM) { vector<Point2f> pts(original); for (int i = 0 ; i < pts.size() ; i ++) { pts[i] = rotatePointByRotationMatrix(pts[i], RM); } return pts; }