当前位置:首页 >> 信息与通信 >>

基于OpenCV的通用人脸检测模块设计


CN 43 1258/ T P ISSN 1007 130X

计算机工程与科学
COM P U T ER EN GIN EERIN G & SCIEN CE

2011 年第 33 卷第 1 期 Vo l 33, N o 1, 2011

文章编号: 1007 130X ( 2011) 01 0097

05

基于 OpenCV 的通用人脸检测模块设计 Design of a Common Face Detect ion M odule Based on OpenCV
张 莹, 李勇平, 敖新宇 ZHANG Ying, LI Yong ping, AO Xin yu ( 中国科学院上海应用物理研究所, 上海 201800) ( Shanghai Institute of Applied Physics, Chinese Academy of Sciences, Shanghai 201800, China) 摘 要: 人脸检测是智能视频监控系统中的重要组成部分, OpenCV 实现的 Adaboo st 人脸检测算法

*

达到了实时检测人脸的处理速度。但在实际应用中, 由于平台移植等障碍, 现有系统升级兼容此模块困 难。本文提出了一种支持多编程语言平台的通用人脸检测模块, 详细阐述了. NET 平台调用技术和改进 的 JNI 方法调用 OpenCV 人脸检测模块的具体步骤和关键过程。该模块解决了. NET 、 a 和 OpenCV Jav 彩色图像数据的传递问题, 定义了人脸检测模块调用的接口标准, 为更多跨平台调用提供参考, 可很容易 地集成到原有视频监控系统当中。通过多次实验验证, 集成该模块的视频系统在系统资源有限的条件下 获得了较高的检测率和处理速度。 Abstract: Face det ection is an important part in int elligent video surveillance systems. T he Adaboost f ace detection algorithm of OpenCV can process videos in a real time w ay. Because of t he languages and plat forms, very few syst ems are compatible with such a funct ion. A module of face det ection that supports multiple pro gram languages is present ed, and t he P/ Invoke techniques in the . NET and t he improved JNI methods for calling the OpenCV face detection module are explained in det ail. T his module solves t he problems of paramet er passing among . NET , Java and OpenCV for color images and can be simply int egrat ed into most existing video based applicat ion systems. It also def ines a standard interf ace for module scheduling and can be referenced by more cross plat form applicat ions. T he ex perimental result s show that t he video systems w hich integrat e this module obtain a high detect ion rat e and real t ime processing speed w it h limit ed system resources. 关键词: 本地方法接口; OpenCV 人脸检测; 视频监控; 性能测试 Key words: nat ive int erf ace; OpenCV face detection; v ideo surv eillance; perf orm ance ev aluat ion doi: 10. 3969/ j. issn. 1007 130X. 2011. 01. 019 中图分类号: T P311. 52 文献标识码: A 模拟的 VCR、 DVR 监控系统只能完成记录和传输

1

引言
视频监控系统已经存在了近 30 年的时间, 但

功能, 较难对信号进行深入的分析和处理, 所以产 生了网络数字视频技术。网络数字视频技术结合 图像处理和计算机视觉等学科和技术, 加快了视频

*

收稿日期: 2009 09 25; 修订日期: 2010 04 15 基金项目: 国家 863 计划资助项目( 2008A A 01Z124) 通讯地址: 201800 上海市嘉定区嘉罗公路 2019 号中国科学院上海应用物理研究所仪器中心 Address: Shanghai Inst itut e of A ppl ied Physics, Chinese A cademy of Sciences, 2019 Jialuo Rd, Jiading D ist rict, Shanghai 201800, P. R. China

97

监控智能化进程, 同时针对不同的 应用或硬件平 台, 微软、 等公司也相应推出自己的视频处理 Sun 软件支持 平台, 如 Directshow 、 F ( Java Media JM Framew ork, 简称 JM F) 等。 目前采用. NET 处理数字视频, 主要是通过非 托管代码调用 Direct show 组 件实现, 具有直接和 硬件打交道、 运算速度快的特点, 同时. NET 是一 个多语言平台, C+ + 、 、 J# 之间可以很容 C# VB、 易地互相调用, 可以面向多种应用, 缺点是稍显复 杂; 而 JMF 则是 Jav a 专门面向媒体数据处理的类 库集合 , 优点是能对底层处理进行更好的封装, 更加容易调用, 缺点是速度和灵活性有待提高。为 基于. NET 和 Java 的视频应用添加人脸检测功能 有三种方法可供选择: 方法一: 分别用. NET 和 Ja v a 重写人脸检测代码。这种 方法工作量很大, 并 且因为两者同时运行在受控环境, 采用解释执行的 机制, 所以针对人脸检测这种计算密集型任务效率 不是很高。方法 二: 采用. NET 或 Java 其中一种 语言的人脸检测模块, 在另外一种语言中调用。这 样虽然减少了工作量, 但目前这两种语言之间还不 存在接口, 著名的 UM L 工具 Rose 的开发商曾致 力于. NET 的 Java 编译 器开发 , 但目前还没有 产品出现, 这种方法同时也存在方法一中的低效问 题。方法三: 调用稳定成熟的为两者都提供接口的 第三种语言实现的人脸检测方法。这些 C/ C+ + 可以做到, 采用 C/ C + + 编 写的 OpenCV 实现了 很多图像处理的通用算法, 且. NET 采用非托管技 术, Java 采用 JNI 技术都可以实现与 C/ C + + 交 互, 通过性能测试也证明了 C/ C+ + 对耗时算法的 运行效率高于其他高级语言和平台。所以综合考 虑应该选择第三种方法。 选定第三种方法, 需要解决以下两个问题: 一 是因为是视频图像处理涉及到三种平台不同语言 之间的数据结构转换问题, 尤其是文献[ 1] 中遇到 的 Java 的 Im ag e 类和 OpenCV 中 IplImage 结构 的转化问题。文 献[ 1] 将彩色图像 转化为灰度图 像, 通过将灰度图 像传入 OpenCV 避免深入解决 Java、 OpenCV 之间 RGB 值对应的问题, 但这样做 也忽略了 IplIm ag e 结构中像素数据需要补齐的要 求, 程序在改变视频采集设备分辨率时会发生运行 时错误。二是程序性能问题, 如何使程序的空间和 时间效率最高。文献[ 1] 中的做法需要另外开辟新 空间, 在 Java 环境下通过循环方式逐像素将彩色 图像转换为灰度图像, 大大增加了系统开销, 使系 统运行效率下降。本文将针对这些问题进行详细 98
[ 2] [ 1]

分析和处理。

2
2. 1

相关原理介绍
. NET 非托管技术及其 Image 结构原理 非托管( U nm anaged) 技术是. NET 为了兼容

旧版本的项目和组件而提出一种在. NET 环境下 直接使用本地代码的接口封装技术, 它避免了组件 的重复开发, 提高了软件的可重用性。非托管代码 和托 管 代 码 的不 同 之 处 是 托 管 代 码 通 过 CL R ( Com mon L ang uag e Runt ime, 简称 CLR) 来 分配 内存管理线程, 而非托管代码通过操作系统来完成 这些工作。最新的非托管代码技术是 COM ( Com po nent Object M odel, 简称 COM ) 调用, COM 是一 种规范, 按照 COM 规范实现 的 DLL 可 以被视为 COM 组件, 在托管代码中可以通过 COM Int er op 实现对 COM 组件的调用, 而 对一般的 DL L 文件 则需要通过平台调用 P / Inv oke 技术 理如图 1 所示。
[ 3]

, 其工作原

图 1 P / Invo ke 服务模 型

将 OpenCV 引 入. NET 平 台, SharperCV
[ 5]

[ 4]



EmGuCv 已经做了大量工作, 本文重点构建通用 人脸检测模块, 所以放弃调用这些已开发的中间封 装包, 以提高程序运行效率, 保证可靠性。 . NET 平台下, 以 C# 的 Bit map 类为例说明 其图像结构原理。Bit map 类提供 GetP ixel 与 Set Pix el 来访问图像的每个像素点, 这是一种优雅的 方式, 但是带来的性能的降低却是不可忽略的。比 如, 对一个 800 600 的彩色图像灰度化, 其耗费的
[ 6]

时间都要以秒为单位来计算 。但是, C# 也提供 了 Bit m apDat a 来直接访问图像数据, Bit mapDat a 对象通过 Bit map 对象的 L ockBits 方法得到, 锁定 指定起始坐标和大小的图像块进行处理。这里 C # 图像数据在内存中的组合方式和 OpenCV 的相 同。出于 显示 性 能 的 考虑, 大 部 分图 像 格 式 如 JP EG、 PNG、 IF F 的 图像 宽度 被填 补成 4 的 倍 T 数, 但 BM P 格式是个例外, 需要手动补齐字节数。 Bit mapDat a 的 St ride 属 性 和 OpenCV 中 的

Widt hSt ep 对应, 它们一般是大于等于图像本身宽 度的那个离它最近的 4 的整倍数, 即每行实际存储 的字节数, 如图 2 所示。

义如图 4 所示, 模块实现了 C/ C+ + 面向 Java 和. NET 的接口, 输入是需要被检测的图像数据, 不同 的视频类型在上层平台中转换为相同格式的字节 数组, 这样使得模块更容易被其他语言平台拓展。 输出是 OpenCV 处理得到的人脸所在区域的坐标 和大小, 这个区域可以在图像中直接标记, 也可以 利用 OpenCV 的图像处理能力做 其他处理, 如保 存、 计数、 识别等。

图 2 . N ET 的图像数据结构

2. 2

JNI 技术及其 Image 结构原理 JNI 技术构架在文献[ 1] 有详细介绍, 这里主

要说明 Java 的图像模型。Jav a 的图像模型基于这 样一种方式: 生产者产生图像位图, 而消费者显示 图像 。图像生产者可以是一个负责网络获取图 像的对象, 或者是描述图像的一个简单字节数组; 图像消费者是一些典型的低层次的绘图例行程序, 将图像显示于屏幕上。在这个模型中, 生产者是可 控的, 所以可以将 OpenCV 看作一个过滤器。Java 应用中的图像装载流程如图 3 所示。JMF 是视频 处理模块, 和静态图像处理的模式类似, 不同点是 在接受视频流之前获得图像长度、 宽度、 颜色映像 等信息, 之后对图像数据进行连续显示。 3. 2
[ 7]

图 4 模块结构及接口定义

实现步骤简介 关于 JNI 技术实现调用 OpenCV 中目标检测方

法的步骤和代码, 这里不再赘述。本文重点介绍. NET 平 台调 用 P/ Invoke 的实 现过 程以 及 Java、 . NET 、 OpenCV 三者基本数据类型之间的差异。 ( 1) 编写 C+ + 代码 F DDLL . cpp, 实现人脸检 测方法, 主要函 数是 Get Dect F ace, 函 数声明如 下 所示: int GetDect Face ( v oid * Image, int w idth, int height , int channel) ; 其中, Image 指针指向图像像素数组, 这 里统一看 作是一维的, 所以同时需要传入图像的宽高 w idt h 和 heig ht , channel 表示图像的通道数。因为 C # 的 Bit mapDat a 对象和 OpenCV 中的 IplIm ag e 都

图 3 Java 图像装载顺序模型

对图像数据进行了填补和对齐, 所以图像数据格式 不用改变。 实现过程应充分利用 OpenCV 提供的多种创 建图像的方法实现不同程序诉求。为了节省空间 提高效率, 选择 cv Cr eat eIm ag eH eader 和 cvSet Da t a 函数创建并初始化图像。 ( 2) 编译 FDDL L. cpp 生成 动态 链接 库 F D DL L . dl l。 ( 3) 编写 C# 代码 F aceDet ect 类, 添加对通用 人脸检 测模 块 的引 用, 声 明 人脸 检 测 方法 Get Dect Face 的参数和返回类型。 [ DllIm po rt( "FDDL L ", Ent ry Point= "GetDectF ace"] / * 参数给 出 dll 中入口点的名称* / public st at ic ext ern int GetDectF ace ( Int Pt r 99

2. 3

OpenCV 的 IplImage 结构原理 IplImage 是 Intel Im ag e Pr ocessing L ibrar y

本身所具有的一种图像结构, OpenCV 只支持其中 的一 个 子 集。 为 了 处 理 方 便, 同 C # 一 样, OpenCV 要求图像宽度必须补齐为 4 的倍数, 因为 BM P 格式不能自动补齐其图像数据字节数, 所以 创建 Iplimage 时, 对 BMP 格式图像要手动补齐使 其宽度字节数为 4 的整数倍。

3
3. 1

通用目标检测模块的实现
系统框架 本文提出的通用人脸检测模块结构及接口定

Im age, int widt h, int heig ht, int channel) ; DllImport 属性 修饰的 方法必 须具有 ex t ern 修饰符, 必须声明为静态的, 表面上参数类型与 C + + 不同之处只有 Imag e 变量, 这 是平台调用对 应的类型变换, 其他参数虽然表现形式没有变化, 但参数的存储方法已经完全不同, 因为在 C+ + 中 int 基本类型是 2 个字节, 而在 C# 中 int 是 4 个字 节。这种现象在 JNI 接口实现中也存在, 表 1 表示 他们三者之间的对应关系。
表 1 C# 、 Java、 + 数据类型之间的对应关系 C+
C# bool byt e char short int long fl oat double void Ob ject Int Pr byt e char short int long fl oat dou ble void Ob ject J ava boolean 本地类型 jb ool ean jb yt e j char j short jin t jl ong jf loat jd oub le void j ob ject C/ C+ + ch ar sh ort long _int 64 f loat doubl e void _jobject 说明 有符号 8 位 有符号 16 位 有符号 32 位 有符号 64 位 32 位 64 位 N/ A N/ A N/ A

Java 中声明顺序为 RGB 格式, 但实际上内存中存 储的顺序为 BGR, 因为一般 PC 支持的存储顺序为 小尾端格式 , 即低地址存储低字节, 高地址存储 高字节, 所以一个表示 RGB 的 32 位整型数在内存 中的顺序是 B, 然后是 G, 最后是 R, 从低到高, 依 次排列。OpenCV 支 持指 针 操作, 所以 OpenCV 明确规定其颜色顺序为 BGR。Java 不支持指针, 所有类型定义靠 JVM 转换。RGB 顺序符合人的 操作习惯, 但容易使人误解在内存中 Java 的像素 值存储的 顺序也为 RGB。清楚这一点之后, Jav a 图像数据转化就容易实现了, 传入图像数据的首地 址, 在 Java 中通过数组名来表示, 在 OpenCV 中创 建 IplIm ag e 图像头, 数据指针设置为 Java 传入的 指针, 因为数据是 32 位整型数, 所以设置通道数为 4, 这样整个数据传递过程就完成了, 因为在同一块 数据空间上进行操作, 节省了空间。 3. 4 实验步骤及实验结果分析 为验证系统嵌入通用模块后的实时检测的性 能, 主要进行两部分实验, 一是 Java、NET 语言自 . 身的性能测试, 二是使用 Delphi 编写的 Pascal 程 序对 Java、 NET 程序运行时间进行测试。因为重 . 点是对接口性能进 行测试, 并 且需要实行统 一标 准, 语言内部自测程序实现的步骤均为: ( 1) 读入一幅彩色图像, 从图像中抽取像素数 组, 并得到图像长宽、 通道等信息; ( 2) 加载 OpenCV 通用模块 FDDL L. dll, 传入 图像像素数组等参数, 程序运行计时开始; ( 3) OpenCV 内部实现人脸检测, 并负责将检 测结果保存, 向外部程序返回检测到的人脸总数; ( 4) 计时结束, 卸载 FDDL L . dl l, 计算 OpenCV 人脸检测模块消耗时间。 Delphi 外部时间检测程序主要是通过命令行 调用可执行程 序的方式来实 现, 记录的 是 Java、 . NET 从启动到运行结束的整个时间长度, 在这里 做统一时间标准使用。 检测分类器采用 OpenCV 发布的 XM L 分类 器文档, 在视频监控过程中通过改变初始检测窗口 大小、 特征放大倍数、 人脸合并个数阈值来调整人 脸检测的精确度和运行速度。文献[ 9] 中指出在检 测窗口大小为 20 20 时, 每次放大 1. 25 倍时检测 模块的速度和正确率达到最佳的平衡。 在 64 位双核 Co re 2 Duo CPU T 8100, 1GB DDR2 667 内存的笔记本电脑上进行实验, 采用的 JDK 环境是 1. 6. 0_12, C/ C+ + 使用 Visual St udi o 6. 0 集成开发环境, . NET 的编译环境为. NET
TM [ 8]

un signed ch ar 无符号 8 位 un signed sh ort 无符号 16 位

In t[ ] , byt e[ ] jin t* , jbyt e* void*

3. 3

视频帧检测的关键过程 上文提到通用模块实现视频中的人脸检测, 接

受外部参数为统一的数组形式的图像数据。如何 将. NET 、 a 程序得到的图像帧转换成符合要求 Jav 的数组形式成了实现人脸检测功能的关键。文献 [ 1] 中 提 到 直 接 将 Jav a 中 的 Im age 类 型 与 OpenCV 对应转换很困难, 所以作者绕过彩色图像 数据转换这一难点, 采用灰度图像 实现了程序功 能。这里存在两个问题: ( 1) 字 节补 齐。本 文第二 节介 绍在 OpenCV 中图像宽度一般是大于等于其本身宽度的那个离 它最近的 4 的整倍数, 灰度图像也不例外。作者实 验中的视频采集设备分辨率为 320 240, 所以图 像宽度 320 是 4 的整数倍, 符合 IplImage 的要求, 程序可以正常运行。但是, 如果更 换视频采集硬 件、 驱动或更改软件设置, 造成图像宽度不能被 4 整除, 那么创建图像时, 图像数据就会产生错误, 出 现混迭现象。 ( 2) RGB 图像数 据的传递。为了将. NET 和 Java 传入的数据转换为统一的 24 位 BGR 存储且 宽度已补齐的 标准数据, 需要 了解. NET 和 Java 的数据格式。 NET 通过 Bit mapDat a 得到的数据 . 和这个规格是一致的, 所以不需要转换和填补; 对 于 Java, 图像生产者从 JM F 创建的视频缓冲区中 取得图像原始数据, 是一个 32 位的整型数组, 且在 100

Framew ork 3. 5。外部计时器使用 Delphi 2007 编 写, OpenCV 检测参数设置为: 特征放大倍数为 1. 1, 人脸合并个数阈值为 2, 逐次改变初始检测窗口 大小, 记录检测模块耗时, Delphi 外部计时结果如 图 5a 所示, 程序自测计时结果如图 5b 所示。 程序内部计时器得到人脸检测模块的检测时 间加上图像保存的时间在 C+ + 、 Java、 中变化 C# 不大, 证明在调用 FDDL L. dll 组件时, 这些语言转 入本地环境, 所以处理时 间大致相同。Java 的内 部测定时间少于 C# , 原因是 JVM 对本地环境的 控制少于. NET 框架; 但其外部测定时间最大表明 在 Window s 平台下, Java 程序启动和垃圾自动回 收机制消耗了多余的时间。根据图 5b 的内部测定 时间, Java、 NET 每检测一帧图像消耗时间可达 . 50m s 左右, 保证了 20 帧/ s 的实时监控速度。
图 6 嵌入 Java、 N et 程序的程序 运行示意图 .

数, 保证准确性和实时性, 达到了可控的实时目标 检测的要求。 参考文献:
[ 1] [ 2] [ 3] 韩露, 李祖枢, 陈东艺. 一种 Java 与 O penC V 结合实现的目标 检测模块[ J] . 计算机应用, 2008, 28( 3) : 29 32. 刘晓华. 精通. N E T 核 心技 术[ M ] . 北京: 电 子工 业出 版社, 2002. 黄际洲, 崔晓源. 精通. N ET 互操作: P/ In vok e、 + Int erop C+ 和 COM Int erop[ M ] . 北京: 人民邮电出版社, 2009. [ 4] [ 5] S harperCV Project [ EB/ O L] . [ 2009 09 17 ] . ht t p: / / ww w . cs. ru . ac. z a/ research/ groups/ S har perCV / . Emgu CV [ EB/ O L] . [ 2009 09 17 ] . ht t p: / / sourcef orge. net / project s/ emgu cv/ . [ 6] [ 7] [ 8] 详细介绍 C# Bit mapDat a[ EB/ O L] . [ 2009 09 17 ] . ht t p: / / developer. 51cto. com . Joseph W eb er. Java 1. 1 使用大全[ M ] . 第三版. 北京: 电子工 业出版社, 1998. Vert s W T . A n Essay on Endian Order[ EB/ O L] . [ 2009 9 17] . htt p: / / w ww . cs. umass. edu/ ~ V ert s/ cs32/ endian. html. [ 9] 赵楠. 基于 Adaboost 的人 脸检测: [ 博 士学 位论文 ] [ D ] . 北 京: 北京大学, 2005.

图 5 不同检 测窗口下的运作时间

OpenCV 通用人脸检测模块可以适当剪裁以 适应不同要求的视频监控场合, 能在较短时间内完 成人脸检测任务。在视频监控这种要求高速度处 理的领域, 结合本地方法完成任务的方法是可行的 优化解决方案。图 6 描述的是 Java、 NET 嵌入通 . 用模块进行视频监控的示意图和. NET 框架下进 行多路人脸检测的程序运行示意图。
recog nitio n. 李勇平( 1963- ) , 男, 江西南昌人, 研究 员, 博士生导师, 研究 方向 为图 像处理 与模 式识 别、 线 控 制 等。 E mail: Y PL i @ si 束 nap. ac. cn LI Yong ping, bo rn in 1963, r esear ch fellow , P hD superviso r, his research inter ests include image processing and patter n r eco gnit ion, beamline contr ol. 张莹( 1986- ) , 女, 河南 获嘉人, 硕 士, 研究方向为生物特征识别。E mail: chr ysoi dine@ g mail. com ZHANG Ying, bor n in 1986, M S, her r e search interests include bio lo gical feature

4

结束语
为现有的视频应用添加人脸检测功能是一项

有市场前景的应用工程, 本文实现 了能直接嵌入 Java、NET 等应用程序的通用人脸检测模块。该 . 模块具有易扩充、 可移植性好等优点。实验结果表 明, 可以根据不同场合的视频监控选择不同检测参

101


相关文章:
基于OpenCV的人脸识别设计方案
基于OpenCV的人脸识别设计方案_金融/投资_经管营销_专业...实现了图像处理和计算机视觉方面的很多通用算法,作为...图 1 程序流程(visio) 3.1 图像采集 图像采集模块...
人脸识别系统中人脸检测模块的研究与实现
24 (二)OpenCV 的介绍安装和配置 ......34 人脸识别系统中人脸检测模块的研究与实现前言人脸检测是作为人脸...实现了图像处理和计算机视觉方面的很多通用 算法。 计...
基于opencv的人脸识别程序-代码
基于opencv的人脸识别程序-代码_计算机软件及应用_IT...构成 ,实现了图像处理和计算机视觉方面的很多通用算法...的应用而设计的一个类库 ,其中所有的函数都由于其...
基于开源算法库的人脸检测系统开发
Python、Ruby、MATLAB 等语言的接口,实现了图像处理和计算 机视觉方面的很多通用...图 1 OpenCV 结构图[10] 第4页 基于开源算法的人脸检测系统开发 CV 模块:...
基于opencv的人脸识别系统_图文
基于opencv的人脸识别系统_互联网_IT/计算机_专业...13 4.3.1 图像获取模块 ......41 2 攀枝花学院本科毕业设计 (论文) 1 绪论 1 绪论 人脸检测与识别是...
基于OpenCV 的人脸检测系统设计与实现
基于OpenCV的通用人脸检测... 5页 免费 基于OpenCV的人脸识别设计... 6页 免费...人脸检测(Face Detection)是指在输入图像中确定所有人脸(如果存在)的位置、 大小...
开题报告-人脸识别系统的研究与实现
书含以下方面的内容: 人脸识别系统的研究与实现 (一) 设计(论文)主要内容: OpenCV 是一个开源的跨平台计算机视觉库,可实现图像处理和计算机视觉 方面的很多通用...
基于Opencv的人脸检测程序源代码(可运行)
基于Opencv的人脸检测程序源代码(可运行)_计算机软件及应用_IT/计算机_专业资料。基于OpenCV可进行图像或者视频中人脸位置的检测,程序准确率高,易理解。1...
人脸检测--创新实验结题书
人脸检测在计算机视觉领域是一个很基础性技术,我们组使用了基于openCV的 Viola-Jones...(部分代码): 1、首先,在 VS2010 平台下建立 win32 项目,设计基本对话框样...
基于opencv的人脸识别程序-代码详解
基于opencv的人脸识别程序-代码详解_计算机软件及应用_IT/计算机_专业资料。#...{ cascade_name = "E:\毕业设计\智能机器人动态人脸识别系统\陈建州程序 ....
更多相关标签:
opencv 人脸检测 | opencv配置和人脸检测 | opencv人脸检测原理 | opencv摄像头人脸检测 | opencv人脸检测代码 | opencv人脸特征点检测 | dlib opencv 人脸检测 | opencv实时人脸检测 |