目标:我正在尝试使用视频作为输入获取虹膜的大小(宽度/半径)。
我尝试过 HoughCircles,但它似乎并不精确,因为虹膜圈似乎不太准确。我已经掌握的信息是眼睛瞳孔的中心点及其半径。
Grayscale Eye
有人建议我找到虹膜边缘来尝试测量从瞳孔中心向外的梯度幅度。然后使用直方图使用梯度最大值的累积来找到虹膜宽度。从特定点开始,我不确定以哪种方式实现这一点。
我在眼睛 ROI 上使用了 Sobel 算子来尝试使用如下所示的输出获得梯度。
Sobel Eye
索贝尔图片代码:
void irisFind(Mat gradMat, Point2i pupCenter, int pupRad){
imshow("original", gradMat);
Mat gradX;
Mat gradY;
Mat absGradX;
Mat absGradY;
GaussianBlur(gradMat, gradMat, Size(3, 3), 0, 0, BORDER_DEFAULT);
equalizeHist(gradMat, gradMat);
//Generate Gradient along x
Sobel(gradMat, gradX, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(gradX, absGradX);
//Generate Gradient along y
Sobel(gradMat, gradY, CV_16S, 0, 1, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(gradY, absGradY);
addWeighted(absGradX, .5, absGradY, .5, 0, gradMat);
imshow("Sobel", gradMat);
}
我不确定接下来如何进行。任何建议或意见表示赞赏。如果我遗漏了任何信息或者我对某些事情含糊不清,也请告诉我。非常感谢提前!
编辑:我应该更好地解释我的应用程序的上下文,所以我为此道歉。我正在测量来自视频输入的帧上眼睛的瞳孔扩张。我已经知道瞳孔中心点的位置和瞳孔半径。我试图找到虹膜的大小,以便从眼睛到相机的距离变化可以用来补偿瞳孔大小的误解值,因为如果眼睛变得更靠近相机,瞳孔当然会出现无扩张时更大。我也可能会尝试其他方法来解决这个问题,例如眼角,但我认为因为我已经有几个瞳孔特征,所以我将从虹膜开始。
再次,很抱歉之前遗漏了这个细节。谢谢!
最佳答案
澄清您在问题中谈到的建议:
“有人建议我找到虹膜边缘来尝试测量从瞳孔中心向外的梯度幅度。然后使用直方图使用梯度最大值的累积来找到虹膜宽度。我不太确定以何种方式实现这一点,从一个特定的点开始。”
你可以具体做的是从你的瞳孔中心开始,并执行一个区域增长算法,其中你的停止条件,而不是蜜蜂,比如一个太不同的灰度值,是梯度大小的阈值。一些伪代码:
initalize list of points with center of your pupil
initialize a mask image to zero
while list of point is not empty
point pt = pop()
set maskImage at pt to 255
for pt2 in pt neighbourhood
if (gradientMagnitude at pt2 < THRESHOLD and maskImage at pt2 == 0)
list of points.add (pt2)
关于c++ - OpenCV 虹膜检测 C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12844479/