-
Notifications
You must be signed in to change notification settings - Fork 20
/
iris_detector.h
90 lines (70 loc) · 2.35 KB
/
iris_detector.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifndef IRIS_DETECTOR_H
#define IRIS_DETECTOR_H
/**
@author Yuta Itoh <[email protected]>, \n<a href="http://wwwnavab.in.tum.de/Main/YutaItoh">Homepage</a>.
**/
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <Eigen/Dense>
#include <Eigen/LU>
#include "iris_geometry.h"
#include "pupiltracker/tracker_log.h"
namespace eye_tracker{
/**
@class IrisDetector
@brief A class for detecting Detects an iris ellipse in a given image
See IrisDetector::DetectIris for more detail.
*/
class IrisDetector
{
public:
IrisDetector(){
};
~IrisDetector(){
ClearEdgeLists();
}
bool DetectIris(cv::Mat &src);
Ellipse get_ellipse(){return ellipse_;};
private:
IrisDetector(const IrisDetector& other);
IrisDetector& operator=(const IrisDetector& rhs);
bool DetectIrisRegion(const cv::Mat &src, cv::Mat &src_eye,
cv::Point2f &iris_pos_in_roi, cv::Point &iris_roi_offset,
std::vector<cv::Point2f> &edgePoints);
// Main function
bool FindLimbus( const cv::Mat &src_img, const cv::Point2f &iris_position_in_roi, const cv::Point &iris_roi_offset,
std::vector<cv::Point2f> &edgePoints);
void RegisterImage( const cv::Mat &src_img );
void MorphologicalPreprocessing();
void ExtractEdges(); /// Apply Canny edge detector
void ExtractEdgesByLSD(const cv::Point2f &iris_position_in_roi); /// Appply Line Segment detector by http://www.ipol.im/pub/art/2012/gjmr-lsd/
double minDitanceBetweenLines( double* a, double *b );
/// Stuff for edge clustering
static bool ComparePoint2iVecPtrPredicate( const EdgeList* lhs, const EdgeList* rhs ){
// const int lhs_len = std::abs<int> ( (*lhs)[lhs->size()-1].y - (*lhs)[0].y );
// const int rhs_len = std::abs<int> ( (*rhs)[rhs->size()-1].y - (*rhs)[0].y );
// return ( lhs_len > rhs_len );
return ( lhs->size() > rhs->size() );
}
inline void ClearEdgeLists(){ for( unsigned int i=0; i<edge_lists_.size(); i++ ) delete edge_lists_[i];}
void RefineEdgeList(const EdgeList &src, EdgeListF &dst);
std::vector< EdgeList* > edge_lists_;
/// Images
cv::Mat src_img_;
cv::Mat src_gray_;
cv::Mat src_gray_blur_;
cv::Mat src_sobel_x_;
cv::Mat src_sobel_y_;
/// Stuff for Elippse fitting
Ellipse ellipse_;
/// Logging
tracker_log log;
};
} /// namespace eye_tracker
#endif // IRIS_DETECTOR_H