示例#1
0
//get position of pupils
void getEyeVectors(Mat &frame, Mat &frame_gray, Rect face) {
	Mat face_frame = frame_gray(face);
	Mat face_frame_color = frame(face);

	//blur to remove some noise
	GaussianBlur(face_frame, face_frame, Size( 0, 0 ), FACE_SMOOTH * face.width);

	//get eye bounding boxes
	int eye_region_width = face.width * (EYE_WIDTH);
	int eye_region_height = face.width * (EYE_HEIGHT);
	int eye_region_top = face.height * (EYE_TOP);
	int eye_region_side =face.width  * (EYE_SIDE);
	Rect left_eye_box(
		eye_region_side,
		eye_region_top,
		eye_region_width,
		eye_region_height
	);
	Rect right_eye_box(
		face.width - eye_region_width - eye_region_side,
		eye_region_top,
		eye_region_width,
		eye_region_height
	);

	//get left center / eye corner
	CvPoint2D32f left_pupil, left_center;
	Mat left_eye = face_frame(left_eye_box);
	left_pupil = getPupilCenter(left_eye);
	left_center = getEyeCenter(face_frame_color, left_eye_box);
	//fix offset
	left_pupil.x  += eye_region_side;
	left_pupil.y  += eye_region_top;
	left_center.x += eye_region_side;
	left_center.y += eye_region_top;

	//get right center / eye corner
	CvPoint2D32f right_pupil, right_center;
	Mat right_eye = face_frame(right_eye_box);
	right_pupil = getPupilCenter(right_eye);
	right_center = getEyeCenter(face_frame_color, right_eye_box);
	//fix offset
	right_pupil.x  += face.width - eye_region_width - eye_region_side;
	right_pupil.y  += eye_region_top;
	right_center.x += face.width - eye_region_width - eye_region_side;
	right_center.y += eye_region_top;

	circle(face_frame, left_pupil, 2, 200);
	circle(face_frame, right_pupil, 2, 200);
	//circle(face_frame, left_center, 3, 200);
	//circle(face_frame, right_center, 3, 200);
	//resize for debugging
	//resize(face_frame, face_frame, Size(500,500), 0, 0, INTER_NEAREST);
	//imshow("cam", face_frame);

	//Point left_vec = left_corner - left_pupil;
	//printf("x: %d, y: %d\n", left_vec.x, left_vec.y);
}
vector<Point> InputProcessing::getFeatures(Mat gray) {
    vector<Point> features;
    Rect face = getFacePosition(gray);

    if (face.width == 0) {
        return features;
    }
    Rect leftEye = getLeftEyePosition(gray, face);
    Rect rightEye = getRightEyePosition(gray, face);

    if (leftEye.width == 0 || rightEye.width == 0) {
        return features;
    }


    features.push_back(getLeftEyeCorner(gray, rightEye));
    features.push_back(getEyeCenter(gray, rightEye));
    features.push_back(getRightEyeCorner(gray, rightEye));
    features.push_back(getLeftEyeCorner(gray, leftEye));
    features.push_back(getEyeCenter(gray, leftEye));
    features.push_back(getRightEyeCorner(gray, leftEye));

    if (features.size() < 6) {
        features.clear();
        return features;
    }

    if (features[0].x == -1 || features[1].x == -1
            || features[2].x == -1 || features[3].x == -1
            || features[4].x == -1 || features[5].x == -1) {
        features.clear();
    }


    return features;
}