- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
对于那些觉得它太长的人,只需阅读粗体字。
我的基于凝视估计的屏幕光标移动HCI项目现在取决于最后一件事-凝视估计,为此,我将眼角用作参考稳定点,相对于该点,我将检测到瞳孔的运动并计算凝视。
但是我无法从实时网络摄像头提要中稳定地检测到眼角。我一直在使用cv.CornerHarris()和GFTT-cv.GoodFeaturesToTrack()函数进行角点检测。 我直接在我的眼睛图像上尝试了FAST演示(来自其网站的可执行文件),但这并不好。
这些是到目前为止我对图像进行角检测的一些结果。
使用GFTT:
使用Harris:
视频中会发生什么:
绿色cirlces是角,其他(粉红色,较小的圆圈)是其他角
我使用了某种启发式方法-如果垂直思考,这些角将在左右两个极端中,并且在中间附近。
我这样做是因为在许多情况下拍摄了很多快照后,除了不到5%的图像外,其余部分都是这样的,并且对于它们来说,上述启发式方法也适用。
但是这些眼角检测用于快照-而不是来自网络摄像头。
当我将方法(harris和GFTT)用于网络摄像头时,我只是不明白。
My code for eye corner detection using cv.CornerHarris
Eye corners using GFTT
现在我在两种方法中都使用的参数-它们显然不会显示针对不同光照条件的结果。但是在与拍摄这些快照相同的光照条件下,我仍然无法从网络摄像头视频中查询到的帧结果
来自GFTT的这些参数对于平均照明条件来说效果很好
cornerCount = 100
qualityLevel = 0.1
minDistance = 5
cornerCount = 500
qualityLevel = 0.005
minDistance = 30
cv.CreateImage((colorImage.width, colorImage.height), 8,1)
cv.CreateImage(cv.GetSize(grayImage), cv.IPL_DEPTH_32F, 1)
max_dist = 0
maxL = 20
maxR = 0
lc =0
rc =0
maxLP =(0,0)
maxRP =(0,0)
for point in cornerMem:
center = int(point[0]), int(point[1])
x = point[0]
y = point[1]
if ( x<colorImage.width/5 or x>((colorImage.width/4)*3) ) and (y>40 and y<70):
#cv.Circle(image,(x,y),2,cv.RGB(155, 0, 25))
if maxL > x:
maxL = x
maxLP = center
if maxR < x:
maxR = x
maxRP = center
dist = maxR-maxL
if max_dist<dist:
max_dist = maxR-maxL
lc = maxLP
rc = maxRP
cv.Circle(colorImage, (center), 1, (200,100,255)) #for every corner
cv.Circle(colorImage,maxLP,3,cv.RGB(0, 255, 0)) # for left eye corner
cv.Circle(colorImage,maxRP,3,cv.RGB(0,255,0)) # for right eye corner
最佳答案
我认为有一种简单的帮助方法!
似乎您正在孤立地考虑每只眼睛。我建议您做的是合并两只眼睛的数据,并使用面部几何形状。我将用一些人可能会认出的图片来说明我的建议(这并不是最好的例子,因为它是一幅画,她的脸有点偏心,但这当然是最有趣的。)
看来您对双眼的瞳孔位置有可靠的估计,并且假设脸部在相机上看起来相当笔直(使用此方法可以垂直于屏幕进行面部旋转),我们知道眼睛的角(从现在开始,仅“角”将位于(或靠近)通过双眼瞳孔的线(红色虚线)上。
我们知道瞳孔之间的距离a
,并且我们知道该距离与一只眼睛的距离(角到角)之间的比率b
对一个人是固定的,并且在成年人口中不会有太大变化(性别可能有所不同)。ie. a / b = constant.
因此,仅知道a
,就可以推论b,而与被摄对象到相机的距离无关。
使用此信息,我们可以为每个眼角构造阈值框(虚线框,详细标记为1, 2, 3, 4
)。每个框都是b
的c
(眼睛的高度,也可以通过相同的固定比率原理确定),并且与瞳孔轴平行。每个盒子的中心边缘固定在瞳孔的中心,并随之移动。我们知道每个角落将始终位于其自己的阈值框中!
现在,麻烦当然是学生们四处走动,我们的阈值框也是如此...但是我们已经以这种方式大大缩小了视野,因为我们可以放心地丢弃所有估计的眼睛位置(来自Harris或GFTT或其他任何东西)落在这些盒子之外(前提是我们对瞳孔检测有信心)。
b
分开并平行于瞳孔轴。 d
(瞳孔距眼中心的位移)。
关于python - 如何进行稳定的眼角检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9645871/
我正在使用 OpenCV4Android 为手机创建基本的情绪检测系统。我的系统已经能够找到嘴并进行一些预处理。我从 Canny 获取面部对象的结果很好: 示例面 1:https://dl.dropb
我是一名优秀的程序员,十分优秀!