人眼检测.py
# 人眼追踪例程
# 用到了OpenMV内置的 "识别人脸的haar算子" 和 "识别人眼的haar算子"
# 该脚本使用内置的前脸检测器来查找脸部,然后查找脸部的眼睛。如果你想确定
# 眼睛的瞳孔,请参阅iris_detection脚本,了解如何做到这一点。
import sensor, time, image
#重置传感器
sensor.reset()
#传感器设置
sensor.set_contrast(1) # 设置对比度为1
sensor.set_gainceiling(16) # 设置增益为16
sensor.set_framesize(sensor.HQVGA) # 设置图像的大小为HQVGA
sensor.set_pixformat(sensor.GRAYSCALE) # 设置图像的格式为灰度图
# 加载Haar算子
# 默认情况下,这将使用所有阶段,较低的阶段更快但不太准确。
face_cascade = image.HaarCascade("frontalface", stages=25) # 定义人脸识别的haar算子
eyes_cascade = image.HaarCascade("eye", stages=24) # 定义眼睛的haar算子
#image.HaarCascade(path, stages=Auto)加载一个haar模型。haar模型是二进制文件,
#这个模型如果是自定义的,则引号内为模型文件的路径;也可以使用内置的haar模型,
#比如【 “frontalface” 人脸模型 】或者【“eye”人眼模型】。
#stages值未传入时使用默认的stages(默认为24-25)。stages值设置的小一些可以加速匹配,但会降低准确率。
print(face_cascade, eyes_cascade)
# FPS clock
clock = time.clock()
while (True):
clock.tick()
# Capture snapshot
#捕获快照
img = sensor.snapshot()
# Find a face !
# scale是一个必须大于1.0的浮点数,较高的scale会运行的更快,但会降低匹配准确率
# 降低threshold会提高检测速率,但会降低准确率
objects = img.find_features(face_cascade, threshold=0.5, scale=1.5) # 先识别人脸:传递人脸的haar算子face_cascade
# 先利用haar算子找到视野中的人脸。image.find_features(cascade, threshold=0.5, scale=1.5),thresholds越大,
# 匹配速度越快,错误率也会上升。scale可以缩放被匹配特征的大小。
# Draw faces
#将找到的人脸用矩形标记出来
for face in objects: # 遍历检测到的每一个人脸
img.draw_rectangle(face) # 在人脸区域周围画框框
# Now find eyes within each face.
# 现在找出每一张脸的眼睛。
# Note: Use a higher threshold here (more detections) and lower scale (to find small objects)
# 注意:这里使用更高的阈值(更多的检测)和更低的尺度(寻找小物体)
eyes = img.find_features(eyes_cascade, threshold=0.5, scale=1.2, roi=face)# 识别人眼:传递人眼的haar算子eyes_cascade
#在人脸中识别眼睛。roi参数设置特征寻找的范围,roi=face即在找到的人脸中识别眼睛。
#将找到的眼睛标记出来
for e in eyes:
img.draw_rectangle(e)
# 打印FPS。
# 注意:实际FPS更高,流FB使它更慢。
print(clock.fps())
瞳孔检测.py
# 瞳孔识别例程
#
# 这个例子展示了如何找到图像中的眼睛后的瞳孔(瞳孔检测)。 该脚本使用
# find_eyes函数来确定应该包含瞳孔的roi的中心点。 它通过基本上找到瞳孔
# 中心的眼睛最黑暗的区域的中心。
#
# 注意:此脚本首先不会检测到脸部,请将其与长焦镜头一起使用(长焦镜头可以把图像拉近)。
import sensor, time, image
#重置传感器
sensor.reset()
#传感器设置
sensor.set_contrast(3) # 设置对比度为3
sensor.set_gainceiling(16) # 设置图像增益为16
# 将分辨率设置为VGA。
sensor.set_framesize(sensor.VGA) # 设置图像分辨率大小为VGA
#拉近镜头,使眼睛的更多细节展现在摄像头中。
# 裁剪图像到200x100,这提供了更多的细节和更少的数据处理
sensor.set_windowing((220, 190, 200, 100))
sensor.set_pixformat(sensor.GRAYSCALE)
# 加载眼睛的haar算子
# 默认情况下,这将使用所有阶段,较低的阶段更快但不太准确。
eyes_cascade = image.HaarCascade("eye", stages=24) # 调用眼睛的haar算子eye,保存到eyes_cascade中
print(eyes_cascade)
# FPS clock
clock = time.clock()
while (True):
clock.tick()
# 截取一张图片
img = sensor.snapshot()
# Find eyes !
# Note: Lower scale factor scales-down the image more and detects smaller objects.
# 注意:较低的比例因子会进一步缩小图像,并检测较小的物体。
# Higher threshold results in a higher detection rate, with more false positives.
# 阈值越高,检测率越高,假阳性也越多。
eyes = img.find_features(eyes_cascade, threshold=0.5, scale=1.5) # 把返回的列表保存到变量eyes中
# 先利用find_features函数识别人眼。image.find_features(cascade, threshold=0.5, scale=1.5),thresholds越大,
# 匹配速度越快,错误率也会上升。scale可以缩放被匹配特征的大小。
# 在识别到的人眼中寻找瞳孔。
for e in eyes:
iris = img.find_eye(e) # 向视野中寻找到的每个人眼,调用find_eye()函数
# 这个函数用于寻找眼睛中的瞳孔,返回值为图像中瞳孔(x,y)位置的元组,若为发现元组,则返回(0,0)
#find_eye的原理是找到区域中颜色最深处的中心(在灰度图的情况下,眼睛中颜色最深的区域就是瞳孔)。
#image.find_eye((x, y, w, h)),find_eye的参数是一个矩形区域roi,左上顶点为
#(x,y),宽w,高h,注意(x,y,w,h)是一个元组,不要漏掉括号()。上行代码中
#的e即代表识别到的眼睛的矩形区域。
img.draw_rectangle(e)
img.draw_cross(iris[0], iris[1])
#用矩形标记人眼,用十字形标记瞳孔。
# Print FPS.
# 注:实际FPS更高,流FB使它更慢。
print(clock.fps())



