openmv模块学习笔记:openmv瞳孔识别代码详细解析

openmv模块学习笔记:openmv瞳孔识别代码详细解析_第1张图片

这段代码的主要功能是使用 OpenMV 摄像头持续采集图像,通过 Haar 级联分类器检测图像中的眼睛,然后在检测到的眼睛区域内寻找瞳孔,并使用矩形框标记眼睛、十字形标记瞳孔的位置,同时输出程序的处理帧率。

# 瞳孔识别例程
#
# 这个例子展示了如何找到图像中的眼睛后的瞳孔(瞳孔检测)。 该脚本使用
# find_eyes函数来确定应该包含瞳孔的roi的中心点。 它通过基本上找到瞳孔
# 中心的眼睛最黑暗的区域的中心。
#
# 注意:此脚本首先不会检测到脸部,请将其与长焦镜头一起使用。
# This example shows how to detect pupils after finding eyes in an image. 
# The script uses the find_eyes function to determine the center point of the ROI that should contain the pupils. 
# It basically finds the center of the darkest area in the eye, which is assumed to be the pupil.
# Note: This script does not detect faces first. Use it with a telephoto lens.

# 导入 sensor 模块,用于控制 OpenMV 摄像头传感器,实现图像采集功能
import sensor
# 导入 time 模块,用于处理时间相关操作,如计时和计算帧率
import time
# 导入 image 模块,用于对采集到的图像进行处理和特征检测
import image

# 重置传感器
# 将摄像头传感器恢复到初始状态,为后续设置做准备
sensor.reset()

# 传感器设置
# 设置摄像头的对比度为 3,适当提高对比度有助于突出图像中的特征
sensor.set_contrast(3)
# 设置摄像头的增益上限为 16,控制图像信号的增强程度
sensor.set_gainceiling(16)

# 将分辨率设置为 VGA,VGA 是一种常见的图像分辨率
sensor.set_framesize(sensor.VGA)

# 拉近镜头,使眼睛的更多细节展现在摄像头中。
# 裁剪图像到 200x100,这提供了更多的细节和更少的数据处理
# 设置图像的窗口区域,只关注图像中指定的部分,减少处理的数据量
sensor.set_windowing((220, 190, 200, 100))

# 设置摄像头的像素格式为灰度图,因为在灰度图中处理颜色深浅更方便
sensor.set_pixformat(sensor.GRAYSCALE)

# 加载眼睛的 haar 算子
# 默认情况下,这将使用所有阶段,较低的阶段更快但不太准确。
# 加载人眼的 Haar 级联分类器,用于检测图像中的眼睛
# stages 参数设置为 24,较低的 stages 可以加快检测速度,但可能会降低准确性
eyes_cascade = image.HaarCascade("eye", stages=24)
# 打印加载的眼睛 Haar 级联分类器信息
print(eyes_cascade)

# FPS clock
# 创建一个时钟对象,用于跟踪帧率(每秒处理的帧数)
clock = time.clock()

# 进入无限循环,持续进行图像采集和瞳孔识别操作
while (True):
    # 更新时钟对象,记录当前帧的开始时间,用于计算帧率
    clock.tick()
    # Capture snapshot
    # 拍摄一张当前摄像头的图像
    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.
    # 阈值越高,检测率越高,假阳性也越多。
    # 在图像中查找眼睛
    # find_features 函数使用 Haar 级联分类器来检测特征
    # threshold 参数控制检测的阈值,值越大匹配速度越快,但错误率可能上升
    # scale 参数用于缩放被匹配特征的大小
    eyes = img.find_features(eyes_cascade, threshold=0.5, scale=1.5)
    # 先利用 find_features 函数识别人眼。image.find_features(cascade, threshold=0.5, scale=1.5),thresholds 越大,
    # 匹配速度越快,错误率也会上升。scale 可以缩放被匹配特征的大小。

    # 在识别到的人眼中寻找瞳孔。
    # 遍历所有检测到的眼睛
    for e in eyes:
        # 在检测到的眼睛区域内寻找瞳孔
        # find_eye 函数通过找到区域中颜色最深处的中心来确定瞳孔位置
        # 参数 e 是一个矩形区域元组 (x, y, w, h),表示检测到的眼睛的位置和大小
        iris = img.find_eye(e)
        # image.find_eye((x, y, w, h)),find_eye 的参数是一个矩形区域,左上顶点为
        #(x,y),宽 w,高 h,注意(x,y,w,h)是一个元组,不要漏掉括号()。上行代码中
        # 的 e 即代表识别到的眼睛的矩形区域。
        # find_eye 的原理是找到区域中颜色最深处的中心。
        # 在图像上绘制矩形框标记出眼睛的位置
        img.draw_rectangle(e)
        # 在图像上绘制十字形标记出瞳孔的位置
        # iris[0] 是瞳孔的 x 坐标,iris[1] 是瞳孔的 y 坐标
        img.draw_cross(iris[0], iris[1])
        # 用矩形标记人眼,用十字形标记瞳孔。

    # Print FPS.
    # 注:实际 FPS 更高,流 FB 使它更慢。
    # 打印当前的帧率,方便了解程序的运行性能
    print(clock.fps())

该脚本中的find_eyes函数是如何实现的?

如何调整代码中的传感器设置以获得更好的效果?

提供一些关于如何使用长焦镜头与该脚本配合的提示。

你可能感兴趣的:(openmv学习笔记,计算机视觉,人工智能,深度学习,opencv,python,学习,笔记)