基于matlab程序实现人脸识别

1.人脸识别流程

1.1.1基本原理

基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。

1.1.2流程图

  1. 人脸识别程序
  1. 人脸和非人脸区域分割程序

function result = skin(Y,Cb,Cr)

%SKIN Summary of this function goes here

%   Detailed explanation goes here

a=25.39;

b=14.03;

ecx=1.60;

ecy=2.41;

sita=2.53;

cx=19.38;

cy=12.02;

xishu=[cos(sita) sin(sita);-sin(sita) cos(sita)];

%如果亮度大于230,则将长短轴同时扩大为原来的1.1倍

if(Y>230)

    a=1.1*a;

    b=41*b;

end

%根据公式进行计算

Cb=double(Cb);

Cr=double(Cr);

t=[(Cb-cx);(Cr-cy)];

temp=xishu*t;

value=(temp(1)-ecx)^2/a2+(temp(2)-ecy)^2/b^2;

%大于1则不是肤色,返回0;否则为肤色,返回1

if value>1

    result=0;

else

    result=1;

end

end

  1. 人脸的确认程序

function eye = findeye(bImage,x,y,w,h)

%FINDEYE Summary of this function goes here

%   Detailed explanation goes here

part=zeros(h,w);

%二值化

for i=y:(y+h)

    for j=x:(x+w)

        if bImage(i,j)==0

            part(i-y+1,j-x+1)=255;

        else

            part(i-y+1,j-x+1)=0;

        end

    end

end

[L,num]=bwlabel(part,8);

%如果区域中有两个以上的矩形则认为有眼睛

if num<2

    eye=0;

else

    eye=1;

end

end

  1. 人脸识别主程序

clear all;

%读入原始图像

I=imread('face3.jpg');

gray=rgb2gray(I);

ycbcr=rgb2ycbcr(I);%将图像转化为YCbCr空间

heighth=size(gray,1);%读取图像尺寸

width=size(gray,2);

for i=1:heighth %利用肤色模型二值化图像

    for j=1:width

        Y=ycbcr(i,j,1);

        Cb=ycbcr(i,j,2);

        Cr=ycbcr(i,j,3);

        if(Y<80)

            gray(i,j)=0;

        else

            if(skin(Y,Cb,Cr)==1)%根据色彩模型进行图像二值化

                gray(i,j)=255;

            else

                gray(i,j)=0;

            end

        end

    end

end

se=strel('arbitrary',eye(5));%二值图像形态学处理

gray=imopen(gray,se);

figure;imshow(gray)

[L,num]=bwlabel(gray,8);%采用标记方法选出图中的白色区域

stats=regionprops(L,'BoundingBox');%度量区域属性

n=1;%存放经过筛选以后得到的所有矩形块

result=zeros(n,4);

figure,imshow(I);

hold on;

for i=1:num %开始筛选特定区域

    box=stats(i).BoundingBox;

    x=box(1);%矩形坐标X

    y=box(2);%矩形坐标Y

    w=box(3);%矩形宽度w

    h=box(4);%矩形高度h

    ratio=h/w;%宽度和高度的比例

    ux=uint16(x);

    uy=uint8(y);

    if ux>1

        ux=ux-1;

    end

    if uy>1

        uy=uy-1;

    end

    if w<20 || h<20|| w*h<400 %矩形长宽的范围和矩形的面积可自行设定

        continue

    elseif ratio<2 && ratio>0.6 && findeye(gray,ux,uy,w,h)==1

        %根据“三庭五眼”规则高度和宽度比例应该在(0.6,2)内;

        result(n,:)=[ux uy w h];

        n=n+1;

    end

end

if size(result,1)==1 && result(1,1)>0 %对可能是人脸的区域进行标记

    rectangle('Position',[result(1,1),result(1,2),result(1,3),result(1,4)],'EdgeColor','r');

else

    %如果满足条件的矩形区域大于1,则再根据其他信息进行筛选

    a=0;

    arr1=[];arr2=[];

    for m=1:size(result,1)

        m1=result(m,1);

        m2=result(m,2);

        m3=result(m,3);

        m4=result(m,4);

        %得到符合和人脸匹配的数据

      

    end

    %得到人脸长度和宽度的最小区域

    arr3=[];arr3=sort(arr1,'ascend');

    arr4=[];arr4=sort(arr2,'ascend');

    %根据得到的数据标定最终的人脸区域

    for m=1:size(result,1)

        m1=result(m,1);

        m2=result(m,2);

        m3=result(m,3);

        m4=result(m,4);

        %最终标定人脸

        if m1+m3<width && m2+m4<heighth && m3<0.2*width

            m3=arr3(1);

            m4=arr4(1);

            rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');

        end

    end

end

(4)程序说明

人脸识别程序主要包含三个程序模块,人脸识别主程序由三部分构成。第一部分:将图像转化为YCbCr颜色空间,根据色彩模型进行图像二值化,二值化图像进行形态学处理、开运算,显示二值图像;第二部分:采用标记方法选取出图中的白色区域,度量区域属性,存放经过筛选以后得到的所有矩形块,筛选特定区域,存储人脸的矩形区域;第三部分:对于所有人脸的矩形区域,如果满足条件的矩形区域大于1则再根据其他信息进行筛选,标记最终的人脸区域。

图像分割程序中,利用肤色可以较为精确的将人脸和非人脸区域分割开来,得到较为精确的二值化图像。

人脸的确认程序,以存储的所有矩形区域作为研究对象,当区域内有眼睛存在时,才认为此区域为人脸区域

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/481030.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java多线程介绍及使用指南

“多线程”&#xff1a;并发 要介绍线程&#xff0c;首先要区分开程序、进程和线程这三者的区别。 程序&#xff1a;具有一定功能的代码的集合&#xff0c;但是是静态的&#xff0c;没有启动运行 进程&#xff1a;启动运行的程序【资源的分配单位】 线程&#xff1a;进程中的…

[论文阅读]Poisoning Retrieval Corpora by Injecting Adversarial Passages

Poisoning Retrieval Corpora by Injecting Adversarial Passages 通过注入对抗性文本对检索语料库进行中毒 http://arxiv.org/abs/2310.19156 EMNLP2023 文章的目标就是要让检索器检索的结果包含攻击者生成的对抗性文本&#xff0c;如果能够检索到&#xff0c;则认为攻击成…

Leetcode 二叉树的锯齿形层序遍历

算法思想&#xff1a; 这段代码实现了 二叉树的锯齿形层序遍历&#xff0c;其核心思想是基于广度优先搜索&#xff08;BFS&#xff09;进行层序遍历&#xff0c;并根据当前层数决定从左到右或从右到左的顺序来组织每一层的节点值。 level.add 和 level.addFirst 有点类似单链…

OpenCV 图像轮廓查找与绘制全攻略:从函数使用到实战应用详解

摘要&#xff1a;本文详细介绍了 OpenCV 中用于查找图像轮廓的 cv2.findContours() 函数以及绘制轮廓的 cv2.drawContours() 函数的使用方法。涵盖 cv2.findContours() 各参数&#xff08;如 mode 不同取值对应不同轮廓检索模式&#xff09;及返回值的详细解析&#xff0c;搭配…

Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)

上篇文章&#xff1a;Linux操作系统2-进程控制2(进程等待&#xff0c;waitpid系统调用&#xff0c;阻塞与非阻塞等待)-CSDN博客 本篇代码Gitee仓库&#xff1a;Linux操作系统-进程的程序替换学习 d0f7bb4 橘子真甜/linux学习 - Gitee.com 本篇重点&#xff1a;进程替换 目录 …

0基础学前端系列 -- 深入理解 HTML 布局

在现代网页设计中&#xff0c;布局是至关重要的一环。良好的布局不仅能提升用户体验&#xff0c;还能使内容更具可读性和美观性。HTML&#xff08;超文本标记语言&#xff09;结合 CSS&#xff08;层叠样式表&#xff09;为我们提供了多种布局方式。本文将详细介绍流式布局、Fl…

Springboot集成通义大模型

1.先到阿里云平台开头阿里云白炼账号&#xff0c;创建apiKey 2. 引入maven依赖 <dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><version>2.8.3</version></dependency><!-- htt…

哈希表算法题

目录 题目一——1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 1.1.暴力解法1 1.2.暴力解法2 1.2.哈希表解法 题目二——面试题 01.02. 判定是否互为字符重排 - 力扣&#xff08;LeetCode&#xff09; 2.1.哈希表解法 2.2.排序解法 题目三——217. 存在重复元…

Cookie跨域

跨域&#xff1a;跨域名&#xff08;IP&#xff09; 跨域的目的是共享Cookie。 session操作http协议&#xff0c;每次既要request&#xff0c;也要response&#xff0c;cookie在创建的时候会产生一个字符串然后随着response返回。 全网站的各个页面都会带着登陆的时候的cookie …

个人博客接入github issue风格的评论,utteranc,gitment

在做个人博客的时候&#xff0c;如果你需要评论功能&#xff0c;但是又不想构建用户体系和评论模块&#xff0c;那么可以直接使用github的issue提供的接口&#xff0c;对应的开源项目有utteranc和gitment&#xff0c;尤其是前者。 它们的原理是一样的&#xff1a;在博客文章下…

React第十节组件之间传值之context

1、Context 使用creatContext() 和 useContext() Hook 实现多层级传值 概述&#xff1a; 在我们想要每个层级都需要某一属性&#xff0c;或者祖孙之间需要传值时&#xff0c;我们可以使用 props 一层一层的向下传递&#xff0c;或者我们使用更便捷的方案&#xff0c;用 creatC…

JVM_垃圾收集器详解

1、 前言 JVM就是Java虚拟机&#xff0c;说白了就是为了屏蔽底层操作系统的不一致而设计出来的一个虚拟机&#xff0c;让用户更加专注上层&#xff0c;而不用在乎下层的一个产品。这就是JVM的跨平台&#xff0c;一次编译&#xff0c;到处运行。 而JVM中的核心功能其实就是自动…

RPA:电商订单处理自动化

哈喽&#xff0c;大家好&#xff0c;我是若木&#xff0c;最近闲暇时间较多&#xff0c;于是便跟着教程做了一个及RPA&#xff0c;谈到这个&#xff0c;可能很多人并不是很了解&#xff0c;但是实际上&#xff0c;这玩意却遍布文末生活的边边角角。话不多说&#xff0c;我直接上…

字符型注入‘)闭合

前言 进行sql注入的时候&#xff0c;不要忘记闭合&#xff0c;先闭合再去获取数据 步骤 判断是字符型注入 用order by获取不了显位&#xff0c;select也一样 是因为它是’)闭合&#xff0c;闭合之后&#xff0c;就可以获取数据了 最后就是一样的步骤

springboot车辆管理系统设计与实现(代码+数据库+LW)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了车辆管理系统的开发全过程。通过分析车辆管理系统管理的不足&#xff0c;创建了一个计算机管理车辆管理系统的方案。文章介绍了车辆管理系统的系统分析部分&…

C#.Net筑基 - 常见类型

01、结构体类型Struct 结构体 struct 是一种用户自定义的值类型&#xff0c;常用于定义一些简单&#xff08;轻量&#xff09;的数据结构。对于一些局部使用的数据结构&#xff0c;优先使用结构体&#xff0c;效率要高很多。 可以有构造函数&#xff0c;也可以没有。因此初始化…

Unity项目性能优化列表

1、对象池 2、检查内存是否泄露。内存持续上升(闭包、委托造成泄露) 3、检查DrawCall数量&#xff0c;尽量减少SetPassCall 4、尽量多的利用四种合批 动态合批(Dynamic Batching)静态合批(Static Batching)GPUInstancingSRP Batcher 动态合批消耗内存把多个网格组合在一起合并…

ComfyUI | ComfyUI桌面版发布,支持winmac多平台体验,汉化共享等技巧!(内附安装包)

ComfyUI 桌面版正式推出&#xff0c;支持 Windows 与 macOS 等多平台&#xff0c;为 AI 绘画爱好者带来全新体验。其安装包便捷易用&#xff0c;开启了轻松上手之旅。汉化共享功能更是一大亮点&#xff0c;打破语言障碍&#xff0c;促进知识交流与传播。在操作上&#xff0c;它…

贪心-区间问题——acwing

题目一&#xff1a;最大不相交区间数量 908. 最大不相交区间数量 - AcWing题库 分析 跟区间选点一样。区间选点&#xff1a;贪心——acwing-CSDN博客 代码 #include<bits/stdc.h> using namespace std;const int N 1e510;struct Range {int l, r;// 重载函数bool op…

【C语言】字符串左旋的三种解题方法详细分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;方法一&#xff1a;逐字符移动法&#x1f4af;方法二&#xff1a;使用辅助空间法&#x1f4af;方法三&#xff1a;三次反转法&#x1f4af;方法对…