Improve iris detection
This commit makes the following changes to the iris detection: - Use Scharr instead os Sobel algorithm for image gradient - Apply Gaussian blur to eye image before processing - Scale down the eye image if too large
This commit is contained in:
parent
60c5254a47
commit
e4d755c00d
|
@ -112,7 +112,8 @@ void cvFrame() {
|
||||||
|
|
||||||
//get ROI for eyes
|
//get ROI for eyes
|
||||||
float eyeWidth = landmarks[biggestFace][45].x - landmarks[biggestFace][42].x;
|
float eyeWidth = landmarks[biggestFace][45].x - landmarks[biggestFace][42].x;
|
||||||
cv::Rect eyeRect(landmarks[biggestFace][42].x, landmarks[biggestFace][42].y - eyeWidth / 2, eyeWidth, eyeWidth);
|
cv::Rect eyeRect(landmarks[biggestFace][42].x,
|
||||||
|
landmarks[biggestFace][42].y - eyeWidth / 2, eyeWidth, eyeWidth);
|
||||||
|
|
||||||
cv::rectangle(frame, eyeRect, cv::Scalar(255, 255, 255));
|
cv::rectangle(frame, eyeRect, cv::Scalar(255, 255, 255));
|
||||||
|
|
||||||
|
@ -121,9 +122,6 @@ void cvFrame() {
|
||||||
|
|
||||||
glm::vec2 eyeVector = eyeDirection(eyeROI);
|
glm::vec2 eyeVector = eyeDirection(eyeROI);
|
||||||
|
|
||||||
cv::imshow("eye", eyeROI);
|
|
||||||
cv::waitKey(1);
|
|
||||||
|
|
||||||
//send control information to graphics
|
//send control information to graphics
|
||||||
float faceSize = landmarks[biggestFace][14].x - landmarks[biggestFace][2].x;
|
float faceSize = landmarks[biggestFace][14].x - landmarks[biggestFace][2].x;
|
||||||
|
|
||||||
|
|
23
src/eye.cpp
23
src/eye.cpp
|
@ -55,16 +55,22 @@ cv::Point2f derivativeFunction(cv::Point2f c, cv::Mat gX, cv::Mat gY) {
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec2 eyeDirection(cv::Mat roi) {
|
glm::vec2 eyeDirection(cv::Mat roi) {
|
||||||
cv::Mat gX, gY;
|
cv::Mat gX, gY, eyeMat;
|
||||||
cv::Sobel(roi, gX, CV_32F, 1, 0);
|
if(roi.rows > 32) {
|
||||||
cv::Sobel(roi, gY, CV_32F, 0, 1);
|
cv::pyrDown(roi, eyeMat, cv::Size(roi.cols / 2, roi.rows / 2));
|
||||||
|
} else {
|
||||||
|
cv::GaussianBlur(roi, eyeMat, cv::Size(7,7), 1);
|
||||||
|
}
|
||||||
|
|
||||||
float stepSize = roi.rows / 10;
|
cv::Scharr(eyeMat, gX, CV_32F, 1, 0);
|
||||||
|
cv::Scharr(eyeMat, gY, CV_32F, 0, 1);
|
||||||
|
|
||||||
|
float stepSize = eyeMat.rows / 10;
|
||||||
float maxVal = 0;
|
float maxVal = 0;
|
||||||
|
|
||||||
cv::Point2f irisPosition;
|
cv::Point2f irisPosition;
|
||||||
for(int i = 0; i < 32; i++) {
|
for(int i = 0; i < 32; i++) {
|
||||||
cv::Point2f c(std::rand() % roi.cols, std::rand() % roi.rows); //start at a random point
|
cv::Point2f c(std::rand() % eyeMat.cols, std::rand() % eyeMat.rows); //start at a random point
|
||||||
|
|
||||||
float prevVal = 0;
|
float prevVal = 0;
|
||||||
for(int j = 0; j < 8; j++) {
|
for(int j = 0; j < 8; j++) {
|
||||||
|
@ -74,7 +80,7 @@ glm::vec2 eyeDirection(cv::Mat roi) {
|
||||||
|
|
||||||
for(int k = 0; k < 6; k++) {
|
for(int k = 0; k < 6; k++) {
|
||||||
cv::Point2f newC = c + gradient * stepSize;
|
cv::Point2f newC = c + gradient * stepSize;
|
||||||
if (newC.x < 0 || newC.x > roi.cols || newC.y < 0 || newC.y > roi.rows) continue;
|
if (newC.x < 0 || newC.x > eyeMat.cols || newC.y < 0 || newC.y > eyeMat.rows) continue;
|
||||||
|
|
||||||
float newVal = objectiveFunction(newC, gX, gY);
|
float newVal = objectiveFunction(newC, gX, gY);
|
||||||
if (newVal > prevVal) {
|
if (newVal > prevVal) {
|
||||||
|
@ -95,7 +101,10 @@ glm::vec2 eyeDirection(cv::Mat roi) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::drawMarker(roi, irisPosition, cv::Scalar(128,128,128));
|
cv::drawMarker(eyeMat, irisPosition, cv::Scalar(128,128,128));
|
||||||
|
|
||||||
|
cv::imshow("eye", eyeMat);
|
||||||
|
cv::waitKey(1);
|
||||||
|
|
||||||
// convert result to vector for graphics
|
// convert result to vector for graphics
|
||||||
return glm::vec2(
|
return glm::vec2(
|
||||||
|
|
Loading…
Reference in a new issue