opencv 做人脸识别 opencv 人脸匹配分析

机器学习
机器学习的目的是把数据转换成信息。
机器学习通过从数据里提取规则或模式来把数据转成信息。

人脸识别
人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸。
每个节点的正确识别率很高,但正确拒绝率很低。
任一节点判断没有人脸特征则结束运算,宣布不是人脸。
全部节点通过,则宣布是人脸。
工业上,常用人脸识别技术来识别物体。

对图片进行识别


代码如下:

#include "opencv2/core/core.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

string face_cascade_name = "haarcascade_frontalface_alt.xml";
CascadeClassifier face_cascade;
string window_name = "人脸识别";

void detectAndDisplay( Mat frame );

int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);

if( argc != 2 || !image.data ){
printf("[error] 没有图片\n");
return -1;
}

if( !face_cascade.load( face_cascade_name ) ){
printf("[error] 无法加载级联分类器文件!\n");
return -1;
}

detectAndDisplay(image);

waitKey(0);
}

void detectAndDisplay( Mat frame ){
std::vector<Rect> faces;
Mat frame_gray;

cvtColor( frame, frame_gray, CV_BGR2GRAY );
equalizeHist( frame_gray, frame_gray );

face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

for( int i = 0; i < faces.size(); i++ ){
Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
}

imshow( window_name, frame );
}

CascadeClassifier类

class CascadeClassifier

用于检测物体的级联分类器类。

CascadeClassifier::CascadeClassifier
从一个文件读取分类器。

C++: CascadeClassifier::CascadeClassifier(const string& filename)
参数 filename – 所要读取分类器文件的文件名





参数 filename – 所要读取分类器文件的文件名

CascadeClassifier::empty
检查分类器是否已经载入。

C++: bool CascadeClassifier::empty() const
CascadeClassifier::load
从一个文件读取分类器。

C++: bool CascadeClassifier::load(const string& filename)
参数 filename – 所要读取分类器文件的文件名。文件可以是旧版的HAAR分类器模型也可以是新版的分类器模型。





参数 filename – 所要读取分类器文件的文件名。文件可以是旧版的HAAR分类器模型也可以是新版的分类器模型。

CascadeClassifier::read
读取一个文件存储节点的分类器。

C++: bool CascadeClassifier::read(const FileNode& node)

CascadeClassifier::detectMultiScale
对不同大小的输入图像进行物体识别,并返回一个识别到的物体的矩阵列表。

C++: void CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size()) 





参数
  • image – 需要检测的 CV_8U 输入矩阵。
  • objects – 输出vector载体容器用于保存被识别的物体矩阵。
  • scaleFactor – 指定每张图片的缩小比例的参数。
  • minNeighbors – 指定每个候选矩阵至少包含的邻近元素个数。
  • flags与旧版级联分类器模型函数cvHaarDetectObjects的flags相同. 此参数不被用于新版模型。
  • minSize – 最小可能的对象的大小,小于的对象将被忽略。
  • maxSize – 最大可能的对象的大小,大于的对象将被忽略。

CascadeClassifier::setImage
设置被用于检测的图像。

C++: bool CascadeClassifier::setImage(Ptr<FeatureEvaluator>& feval, const Mat& image)





参数
  • feval – 用于特征计算的特征求值程序的指针。
  • image – 需要进行特征检测的 CV_8U 输入矩阵。

这个函数将在每张图片中被 CascadeClassifier::detectMultiScale() 自动调用。 但如果你想在不同位置手动使用 CascadeClassifier::runAt(),你需要先调用该函数,使得图像被积分计算。

CascadeClassifier::runAt
在指定点运行检测。

C++: int CascadeClassifier::runAt(Ptr<FeatureEvaluator>& feval, Point pt, double& weight) 





参数

feval – 用于特征计算的特征求值程序。

pt – 指定检测窗口左上角的点。窗口的大小和检测的图片大小一致。


如果级联分类器检测到给定的位置中的一个对象,该函数返回1。否则,它会返回已被否决的候选区域在哪个阶段的否定的指数。

使用CascadeClassifier::setImage() 设置图像的检测工作。

代码注释

代码如下:

//需要载入的级联分类器文件
string face_cascade_name = "haarcascade_frontalface_alt.xml";
//级联分类器类
CascadeClassifier face_cascade;

//……

//载入级联分类器,并判断是否载入成功,如果不成功则打印提示
if( !face_cascade.load( face_cascade_name ) ){
printf("[error] 无法加载级联分类器文件!\n");
return -1;
}

//……

//对图片frame进行识别检测
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

转换成灰度图

由于CascadeClassifier类只支持CV_8U矩阵数据,所以我们需要将图片变成灰度图。

cvtColor API:

将图片从一个色彩空间转到另一个色彩空间。

C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )





参数
  • src – 输入图像:8位无符号,16位无符号(CV_16UC...),或单精度浮点数据类型。
  • dst – 输出图像,与输入图像相同大小、深度。
  • code – 颜色空间转换代码。
  • dstCn – 目标图像的通道数,当该参数为0时,则通道树由src和code自动得出。

该函数将输入图片从一个色彩空间转到另一个色彩空间。当从RGB颜色空间进行变换时,应明确指定的信道的顺序(RGB或BGR)。值得注意,在OpenCV的默认颜色格式中,通常被称为作为RGB,但实际上是BGR(字节是相反的)。因此,在一个标准的(24位)的彩色图像的第一个字节是一个8位的蓝色分量,第二个字节将是绿色的,第三个字节将是红色的。而第四,第五,和第六字节,则是第二像素(蓝,然后绿色,然后红色),依此类推。

R、G和B 通道通常信道值范围

CV_8U:0 — 255
CV_16U:0 — 65535
CV_32F:0 — 1
线性变换的情况下,有没有范围是无所谓的。但是,在一个非线性变换的情况下,输入的RGB图像应被归为适当的值范围内,以得到正确的结果。例如,如果你有一个32位浮点图像直接转换成一个8位的图像而没有任何缩放,那么它将有0到255的数值范围,而这并不能准确0..1所有浮点数的值。所以,你需要之前调用cvtColor,进行图像缩放。

代码注释:


代码如下:

//将frame转换成灰度图,输出到frame_gray
cvtColor( frame, frame_gray, CV_BGR2GRAY );

直方图均衡化

直方图是图像中像素强度分布的图形表达方式。
它统计了每一个强度值所具有的像素个数。
 
直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。
说得更清楚一些, 以上面的直方图为例, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是 拉伸 这个范围. 见下面左图: 绿圈圈出了 少有像素分布其上的 强度值. 对其应用均衡化后, 得到了中间图所示的直方图. 均衡化的图像见下面右图.
 
我们利用直方图均衡化对图片增强对比度,方便级联分类器分析。

equalizeHist API:

对灰度图像进行直方图均衡。

C++: void equalizeHist(InputArray src, OutputArray dst)

table4
直方图均衡函数使用了下列的算发:

计算源文件的直方图 。

调整直方图,使得其方格总个数为255。

对直方图进行积分:

使用变换图片,其映射函数为:

该算法归一化亮度并增加了图像的对比度。

(0)

相关推荐

  • OpenCV实现人脸识别

    主要有以下步骤: 1.人脸检测 2.人脸预处理 3.从收集的人脸训练机器学习算法 4.人脸识别 5.收尾工作 人脸检测算法: 基于Haar的脸部检测器的基本思想是,对于面部正面大部分区域而言,会有眼睛所在区域应该比前额和脸颊更暗,嘴巴应该比脸颊更暗等情形.它通常执行大约20个这样的比较来决定所检测的对象是否为人脸,实际上经常会做上千次. 基于LBP的人脸检测器基本思想与基于Haar的人脸检测器类似,但它比较的是像素亮度直方图,例如,边缘.角落和平坦区域的直方图. 这两种人脸检测器可通过训练大的图

  • 基于OpenCV的PHP图像人脸识别技术

    openCV是一个开源的用C/C++开发的计算机图形图像库,非常强大,研究资料很齐全.本文重点是介绍如何使用php来调用其中的局部的功能.人脸侦查技术只是openCV一个应用分支. 1.安装 从源代码编译成一个动态的so文件. 1.1.安装 OpenCV (OpenCV 1.0.0) 下载地址:http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948 #tar xvzf OpenCV-1.0.0.ta

  • python使用opencv进行人脸识别

    环境 ubuntu 12.04 LTS python 2.7.3 opencv 2.3.1-7 安装依赖 sudo apt-get install libopencv-* sudo apt-get install python-opencv sudo apt-get install python-numpy 示例代码 #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv d

  • python实现图像,视频人脸识别(opencv版)

    图片人脸识别 import cv2 filepath = "img/xingye-1.png" img = cv2.imread(filepath) # 读取图片 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色 # OpenCV人脸识别分类器 classifier = cv2.CascadeClassifier( "C:\Python36\Lib\site-packages\opencv-master\data\haar

  • python实现图片,视频人脸识别(opencv版)

    图片人脸识别 import cv2 filepath = "img/xingye-1.png" img = cv2.imread(filepath) # 读取图片 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色 # OpenCV人脸识别分类器 classifier = cv2.CascadeClassifier( "C:\Python36\Lib\site-packages\opencv-master\data\haar

  • 百度人脸识别之人脸识别FaceIdentify(签到考勤)

    本文实例为大家分享了百度人脸识别之人脸识别FaceIdentify,供大家参考,具体内容如下 using System.Collections.Generic; using UnityEngine; using Baidu.Aip.Face; using Newtonsoft.Json.Linq; using UnityEngine.UI; using System.IO; //识别,(用于签到考勤) public class FaceIdentify : MonoBehaviour { pri

  • Java基于虹软实现人脸识别、人脸比对、活性检测等

    目录 虹软 一.注册虹软开发者平台 二.开始使用SDK 虹软 免费,高级版本试用 支持在线.离线 有 Java SDK,C++ SDK 一.注册虹软开发者平台 点击注册 注册完成后可在“我的应用”中新建应用,获得 APP_ID 和 SDK_Key,请记住这两个信息,后续 SDK 中会用到. 接下来下载SDK就行了. 二.开始使用SDK SDK包结构在下载的sdk包中,包结构大概是这样 |—demo| |—ArcFaceDemo Demo工程|—doc| |—ARCSOFT_ARC_FACE_DE

  • opencv 做人脸识别 opencv 人脸匹配分析

    机器学习 机器学习的目的是把数据转换成信息. 机器学习通过从数据里提取规则或模式来把数据转成信息. 人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸. 每个节点的正确识别率很高,但正确拒绝率很低. 任一节点判断没有人脸特征则结束运算,宣布不是人脸. 全部节点通过,则宣布是人脸. 工业上,常用人脸识别技术来识别物体. 对图片进行识别 复制代码 代码如下: #include "opencv2/core/core.hpp" #include "opencv2/obj

  • Android开发人脸识别统计人脸数

    本文实例为大家分享了Android开发人脸识别统计的具体代码,供大家参考,具体内容如下 最近项目需求是统计当前摄像头中的人脸个数,安卓有提供现成的Api,最终实现效果如上图. 分析思路和步奏: 主要使用到的类:SurfaceView.CameraManager.CameraDevice.StateCallback.CameraCaptureSession.StateCallback. 1.通过SurfaceView展示预览区. 2.在SurfaceView创建成功后通过CameraManager

  • Dlib+OpenCV深度学习人脸识别的方法示例

    前言 人脸识别在LWF(Labeled Faces in the Wild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非常高了,但是真实的环境中的准确率有多少呢?我没有这方面的数据,但是可以确信的是真实环境中的识别率并没有那么乐观.现在虽然有一些商业应用如员工人脸识别管理系统.海关身份验证系统.甚至是银行人脸识别功能,但是我们可以仔细想想员工人脸识别管理,海关身份证系统的应用场景对身份的验证功能其实并没有商家吹嘘的那么重要,打个比方说员工上班的时候刷脸如果失败了会怎样,是不是重新识

  • OpenCV Java实现人脸识别和裁剪功能

    本文实例为大家分享了OpenCV Java实现人脸识别和裁剪的具体代码,供大家参考,具体内容如下 安装及配置 1.首先安装OpenCV,地址 这里我下载的是Windows版的3.4.5 然后安装即可-- 2.Eclipse配置OpenCV Window->Preferences->Java->User Libraries New输入你的Libraries名 这里我的安装目录是D:\OpenCV,所以是: 然后引入dll,我是64位机子,所以是: Ok,下面创建Java项目做Java与Op

  • Python+OpenCV人脸识别签到考勤系统实现(新手入门)

    前言 本项目为IOT实验室人员签到考勤设计,系统实现功能:1.人员人脸识别并完成签到/签退2.考勤时间计算3.保存考勤数据为CSV格式(Excel表格) PS:本系统2D人脸识别,节约了繁琐的人脸识别训练部分,简洁快捷 该项目为测试版,正式版会加入更多的功能,持续更新中…测试版项目地址我会放到结尾 项目效果图 系统初始化登陆界面 主界面展示图: 签到功能展示 签退功能展示 后台签到数据记录 是否签到/退判断 项目需要的环境 核心环境: OpenCV-Python 4.5.5.64 face_re

  • 基于Python搭建人脸识别考勤系统

    目录 介绍 人脸识别的实际应用 构建人脸识别系统的步骤 安装库 导入库 加载图像 查找人脸位置并绘制边界框 为人脸识别训练图像 构建人脸识别系统 人脸识别系统面临的挑战 结论 介绍 在本文中,你将学习如何使用 Python 构建人脸识别系统.人脸识别比人脸检测更进一步.在人脸检测中,我们只检测人脸在图像中的位置,但在人脸识别中,我们制作了一个可以识别人的系统. "人脸识别是验证或识别图片或视频中的人的挑战.大型科技巨头仍在努力打造更快.更准确的人脸识别模型." 人脸识别的实际应用 人脸

随机推荐