为之 发表于 2021-4-4 01:29:52

Maixpy 调用内置haar算子实现人脸(正脸)检测和瞳孔检测

本帖最后由 为之 于 2021-4-4 01:31 编辑

## Introduction

为什么会产生想写这部分的帖子,原因有两点:

第一点:在首次阅读Maxipy文档到机器视觉部分时看见这样一句话**(Maixpy 的 Image)移植于OpenMV,与OpenMV功能相同**。也就是说在K210上可以跑OpenMV的Image部分,那一刻就有被触动到,早已想玩耍这部分。

第二点:自己曾说过要写这部分帖子,言既出,则必行!
废话不多说,开始步入今天的主题。
## Main Ideas

本帖子主要介绍如何调用Maixpy含OpenMV部分的固件中的haar算子,实现人脸检测(正脸)+ 瞳孔检测等

## Code

```python
# 调用内置前脸检测器查找脸部,而后查寻瞳孔

import sensor, time, image
import lcd

lcd.init()
sensor.reset()
sensor.set_contrast(1)
sensor.set_gainceiling(16)
#sensor.set_hmirror(1)   
#sensor.set_vflip(1)
sensor.set_framesize(sensor.QQVGA)
sensor.set_pixformat(sensor.RGB565)   

# load Haar Cascade
face_cascade = image.HaarCascade("frontalface", stages=25)      # face
eyes_cascade = image.HaarCascade("eye", stages=24)                # eye
'''
Note:
# image.HaarCascade(path, stages=Auto)加载一个haar模型    (haar模型为二进制文件)
该模型若为自定义,则引号内为模型文件的路径;也可使用内置的haar模型---如“frontalface” 人脸模型、“eye”人眼模型;
stages值未传入时使用默认stages; 若stages值设置较小可加速匹配,但会降低识别正确率 !!!
'''
print(face_cascade, eyes_cascade)

clock = time.clock()      # FPS clock
img = None                           # face IMAGE--- RGB565
img1 =None                  # eyeIMAGE--- Grayscale
while (True):
   clock.tick()
   img = sensor.snapshot()
   faces = img.find_features(face_cascade, threshold=1.1, scale=1.35)
   # threshold 大小需根据实际情况反复调试,此处仅作参考
   for f in faces:
       if f:
         # print("Found the face")
         img.draw_rectangle(f,color=(255,0,0))
         img1 = img.to_grayscale(copy=True)   
         # Note:瞳孔检测Image仅支持Grayscale格式
         eyes = img1.find_features(eyes_cascade, threshold=1.4, scale=1.2, roi=face)
         # 同上, threshold大小 需根据实际情况反复调试,此处仅作参考
         for e in eyes:
               if e:
                   # print("Found the eye")
                   iris = img1.find_eye(e)
                   img.draw_rectangle(e,color=(0,0,0))
                   iris = img1.draw_cross(iris, iris)
   lcd.display(img)
   print(clock.fps())
```

## API

```python
image.HaarCascade(path, stages=Auto)         
```
- **该模型若为自定义,则引号内为模型文件的路径;也可使用内置的haar模型 ------ 如“frontalface” 人脸模型、“eye”人眼模型;**
- stages值未传入时使用默认stages; **若stages值设置较小可加速匹配,但会降低识别正确率** !!!

```
image.find_features(cascade[, threshold=0.5[, scale=1.5[, roi]]])
```
- **What's the Haar Cascade ?**

> **Haar Cascade是一系列用来确定一个对象是否存在于图像中的对比检查. **这一系列的对比检查分成多个阶段,后一阶段的运行以先前阶段的完成为前提。大范围的检查在前期阶段首先进行,在后期进行更多更小的区域检查。

- **HOW to make Haar Cascade?**

> **利用OpenCV训练,再将生成的XMl文件转换为cascade文件**,这样就可以直接在Maixpy中通过SD加载调用。
> 这部分的东西就下次再出帖子介绍吧。

- **OpenCV 库自带的一些XML文件**

![](https://i.bmp.ovh/imgs/2021/04/ea90f14684c4b0e6.png)      

## Result

- 演示一下利用内部haar算子实现的人脸检测+瞳孔识别

- 说明:**这里使用的Maixpy固件版本(支持OpenMV部分)为maixpy_v0.6.2_41_g02d12688e_openmv_kmodel_v4_with_ide_support.bin**

## Reference
- https://maixpy.sipeed.com/zh/api_reference/machine_vision/image/image.html#haarcascade-%E7%B1%BB-%E2%80%93-%E7%89%B9%E5%BE%81%E6%8F%8F%E8%BF%B0%E7%AC%A6      
- https://docs.singtown.com/micropython/zh/latest/openmvcam/library/omv.image.html
页: [1]
查看完整版本: Maixpy 调用内置haar算子实现人脸(正脸)检测和瞳孔检测