基于FPGA的人脸识别

article/2025/9/30 13:27:48

基于FPGA的人脸识别

一.理论基础

1.基本介绍

模块框图:
在这里插入图片描述

在上一篇文章里,已经实现了基于OV5640的摄像头监控,在此基础上,我们加入一些图像处理的内容,即可实现简单的一些图像处理效果,这次做到的就是最基础的人脸识别功能。

2.理论知识

(1)RGB->YCBCR

因为RGB全彩图像对于图像处理很困难,所以大部分采用的都是将图像信息二值化,也就是我们所理解的黑白图像。所以我们第一个需要的就是将图像信息从RGB转成ycbcr格式。
RGB转换YCBCR格式的公式如下:

Y = 0.299R +0.587G + 0.114B
Cb = 0.568(B-Y) + 128
CR = 0.713(R-Y) + 128

经过上面公式我们就可以将RGB转换成YCBCR格式

(2)图像二值化

得到了YCBCR格式的图像数据之后,我们就可以通过设定阈值的范围来获得我们所需要的图像信息了,处理之后的效果就是人脸部分显示白色,其余部分显示黑色。
比如我们这里要得到的人脸的肤色,根据查询,人脸的阈值如下:
77 < Cb < 127
133 < Cr < 173

(3)滤波

由于我们实现的是最基本的图像处理效果,所以此次的介绍没有加入滤波的方法。但可以介绍一下滤波的原因和方法,具体内容后期随缘介绍哈哈。
滤波的原因:
在我们的摄像头采集图像信息的过程中,由于硬件本来存在的问题,会有一些飘动的白点进行调动,这就是我们所说的图像噪点。(小时候的电视机的雪花就是这样滴)
滤波的方法:
就我所知的图像处理方法比较有限且基础,有中值滤波,均值滤波,服饰和膨胀算法等等,还有一些其他比如帧差发来检测快速运动物体,光流法等。

(4)识别有效区域

为了更加直观的看到处理的结果,我们用红框来框选住我们所处理之后的图像信息。但是我们不能无缘无故就可以准确的框选我们所要的内容,所以我们需要进行识别有效的区域,即得到有效图像的最小和最大的X,Y的坐标,来进行框选。
具体思路就是:用X,Y分别扫描图像信息,第一个得到的1.和第一个从1反转到0的坐标进行寄存,然后经过运算之后就可以准确的得到这四个值:
X min,X max,Y min,Y max.
当然,没有进行滤波的图像会产生很多的噪点,导致框选的内容有问题,这里只是提供一个思路。可以用开运算进行去除噪点。

(5)画框

将上一模块传来的X min,X max,Y min,Y max值分别赋予红色之后,就可以框选出我们想要框选的内容。
具体代码体现:

if(vga_y== y_min && vga_x>= x_min && vga_x<= x_max)rgb <= RED;else if(vga_y== y_max && vga_x>= x_min && vga_x<= x_max)rgb <= RED;else if(vga_x== x_min && vga_y>= y_min && vga_y<= y_max)rgb <= RED;else if(vga_x== x_max && vga_y>= y_min && vga_y<= y_max)rgb <= RED

二.系统RTL及模块核心代码

1.系统RTL

在这里插入图片描述在这里插入图片描述

1.模块核心代码

(1)RGB->YCBCR

//step1 计算括号内的各乘法项
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginrgb_r_m0 <= 16'd0;rgb_r_m1 <= 16'd0;rgb_r_m2 <= 16'd0;rgb_g_m0 <= 16'd0;rgb_g_m1 <= 16'd0;rgb_g_m2 <= 16'd0;rgb_b_m0 <= 16'd0;rgb_b_m1 <= 16'd0;rgb_b_m2 <= 16'd0;endelse beginrgb_r_m0 <= rgb888_r * 8'd77 ;rgb_r_m1 <= rgb888_r * 8'd43 ;rgb_r_m2 <= rgb888_r * 8'd128;rgb_g_m0 <= rgb888_g * 8'd150;rgb_g_m1 <= rgb888_g * 8'd85 ;rgb_g_m2 <= rgb888_g * 8'd107;rgb_b_m0 <= rgb888_b * 8'd29 ;rgb_b_m1 <= rgb888_b * 8'd128;rgb_b_m2 <= rgb888_b * 8'd21 ;end
end//step2 括号内各项相加
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginimg_y0  <= 16'd0;img_cb0 <= 16'd0;img_cr0 <= 16'd0;endelse beginimg_y0  <= rgb_r_m0 + rgb_g_m0 + rgb_b_m0;img_cb0 <= rgb_b_m1 - rgb_r_m1 - rgb_g_m1 + 16'd32768;img_cr0 <= rgb_r_m2 - rgb_g_m2 - rgb_b_m2 + 16'd32768;endend//step3 括号内计算的数据右移8位
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginimg_y1  <= 8'd0;img_cb1 <= 8'd0;img_cr1 <= 8'd0;endelse beginimg_y1  <= img_y0 [15:8];img_cb1 <= img_cb0[15:8];img_cr1 <= img_cr0[15:8];end
end

(2)识别有效区域

//x_min lag 2clk
always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)beginx_min <= ROW_CNT;endelse if(flag)x_min <= ROW_CNT;else if(per_frame_clken && per_img_Bit == 1 && x_min > cnt_x)x_min <= cnt_x;else x_min <= x_min;
end
//x_max
always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)beginx_max <= 0;endelse if(flag)x_max <= 0;else if(per_frame_clken && per_img_Bit == 1 && x_max < cnt_x)x_max <= cnt_x;else x_max <= x_max;
end
//y_min
always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)beginy_min <= COL_CNT;endelse if(flag)y_min <= COL_CNT;else if(per_frame_clken && per_img_Bit == 1 && y_min > cnt_y)y_min <= cnt_y;else y_min <= y_min;
end
//y_max
always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)beginy_max <= 0;endelse if(flag)y_max <= 0;else if(per_frame_clken && per_img_Bit == 1 && y_max < cnt_y)y_max <= cnt_y;else y_max <= y_max;
end

初学入门,分享学习笔记和心得,如有指教,感激不尽!

由于最近板子做在了课设上,所以暂时没有上板的效果,等课赛开始之后,将即时上传上板的效果图片。


http://chatgpt.dhexx.cn/article/gcAiieed.shtml

相关文章

facenet 人脸识别原理理解(三)

在前两篇文章已经介绍了facenet人脸识别代码的使用和具体操作&#xff0c;但相关的原理还是没有说&#xff0c;这篇文章进行简单的讲解一下。 1. 原理 在人脸识别中&#xff0c;当我们需要加在图片数据库入新的一张人脸图片时&#xff0c;是怎么做到识别的呢&#xff0c;难道…

人脸识别mtcnn原理

人脸检测&#xff0c;也就是在图片中找到人脸的位置。输入是一张可能含有人脸的图片&#xff0c;输出是人脸位置的矩形框。 人脸对齐。原始图片中人脸的姿态、位置可能有较大的区别&#xff0c;为了之后统一处理&#xff0c;要把人脸“摆正”。为此&#xff0c;需要检测人脸中…

dlib中的人脸识别原理

这里讨论的是人脸识别&#xff0c;不是人脸检测 dlib中是先检测都人脸&#xff0c;然后把人脸通过Resnet生成一个128维的向量&#xff0c;Resnet有几种不同深度的结构(图片来自https://raw.githubusercontent.com/raghakot/keras-resnet/master/images/architecture.png) dlib…

计算机识别人脸原理,深入浅出人脸识别原理

编辑推荐: 本文主要介绍了人脸识别流程,如何提取面部训练数据进行识别以及人脸检测和人脸识别,它们应用场景有哪些,希望对您的学习又所帮助。 本文来自于csdn,由火龙果软件Alice编辑、推荐。 前不久Iphone X发布,革命性的取消了TouchID(指纹识别),而添加了更酷的 FaceID(…

基于html5鼠标悬停图片动画展示效果

分享一款基于html5鼠标悬停图片动画展示效果。里面包含两款不同效果的html5图片展示效果。效果图如下&#xff1a; 在线预览 源码下载 实现的代码。 html代码&#xff1a; <div class"wrap" id"wrap"><div style"float: left; padding-top…

组件分享之后端组件——一个简单且高度可扩展的分布式文件系统seaweedfs

组件分享之后端组件——一个简单且高度可扩展的分布式文件系统seaweedfs 背景 近期正在探索前端、后端、系统端各类常用组件与工具&#xff0c;对其一些常见的组件进行再次整理一下&#xff0c;形成标准化组件专题&#xff0c;后续该专题将包含各类语言中的一些常用组件。欢迎大…

代理神器Charles4.2.8的破解

打开Charles&#xff0c;点击工具栏的Help&#xff0c;选择Register Charles&#xff0c;在两栏里分别输入即可。 Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4

TLS加密套件

出于兴趣爱好&#xff0c;决定开发TLS1.2-1.3的一个库。为此阅读了TLS相关的若干RFC文档&#xff0c;以及查阅了多篇相关博客文章。最终有以下发现&#xff1a; 1. TLS定义了几百个加密套件(参考https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml)&#x…

sshd服务及防暴力破解 附赠防暴力破解脚本

利用yum源安装sshd服务客户端安装&#xff1a;openssh-clients.x86_64 服务端安装&#xff1a;openssh-server.x86_64Openssh和sshd有区别吗&#xff1f; 两个是不同的概念&#xff0c;软件包名称叫openshh 开机的服务叫sshd[rootserver1 ~]# rpm -ql openssh ###查看安装的…

The server selected protocol version TLS10 is not accepted by client preferences [TLS12]

最近在部署项目的时候遇到一个问题&#xff0c;卡了整整一天时间&#xff0c;所以感觉有必要po个解决方法出来给有需要的朋友参考一下。 问题描述&#xff1a;Caused by: javax.net.ssl.SSLHandshakeException: The server selected protocol version TLS10 is not accepted b…

TLS 1.3 协议详解

TLS 1.3 握手流程详解 我的TLS实现&#xff08;支持TLS1.3和国密SSL&#xff09;&#xff0c;大家可以学习参考&#xff1a;https://github.com/mrpre/atls/ 如果觉得有用&#xff0c;请打赏N元&#xff1a;http://39.98.242.44 需要的背景知识&#xff1a; &#xff08;1&am…

服务攻防-协议漏洞-FTPRDPSSHRsyncProFTPDlibsshOpenssh-Hydra工具使用口令猜解未授权访问

目录 一、导图 二、口令猜解-Hydra-FTP&RDP&SSH 1、协议介绍 2、Hydra工具介绍 3、实例演示 三、配置不当-未授权访问-Rsync 文件备份 1、Rsync介绍 2、漏洞成因——配置不当 3、实例演示 四、协议漏洞-应用软件-FTP&ProFTPD搭建 1、引入 2、ProFTPD介…

提示:The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]

JMeter连接SQLservice数据库。 1、测试计划添加sqljdbc41.jar 2、添加数据库配置 3、添加请求 3、按着上面的配置&#xff0c;执行&#xff0c;然后报错误了。 提示“Cannot create PoolableConnectionFactory (The driver could not establish a secure connection to SQL S…

SSH暴力破解

ssh暴力破解解决方案 https://www.cnblogs.com/walkingzq/p/8191900.html 最近在使用腾讯云服务器的过程中&#xff0c;被比特币黑客黑了一次服务器&#xff08;如下图所示&#xff09;。 图1 比特币勒索信息 继而认识到网络安全的重要性。在重新安装系统之后&#xff0c;发现…

SSL/TLS Cipher Suites

Cipher Suite 一个加密算法套件&#xff08;CipherSuite&#xff09;是一个四件套&#xff0c;由各类基础的加密算法组成&#xff0c;主要包含了四类&#xff1a; 1&#xff09;Key Exchange 密钥交换算法&#xff1b; 2&#xff09;Authentication 身份认证算法&#xff1b…

The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]

springboot启动时报错 com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client prefer ences [TLS13, TLS12]”。 原因&…

centos7 SSH防暴力破解五种方法

什么是暴力破解&#xff0c;简单来说就是对一个服务器进行无数次尝试登陆&#xff0c;并用不同的密码进行登陆直到可以登陆成功。暴力破解的基本步骤可以分为以下几步&#xff1a; 找到对应的linux服务器 Ip地址扫描端口号&#xff1a;22 nmap扫描端口开始暴力破解 : 一般root…

Linux云服务器防止暴力破解(三道SSH安全策略)

前言 新购入的服务器&#xff0c;往往用户名默认为root&#xff0c;ssh默认开放22端口&#xff0c;且配置SSH服务时往往同时允许密码和公钥二重登录。然而&#xff0c;许多非法服务器运行着暴力破解程序&#xff0c;通过访问用户名root的22默认端口&#xff0c;暴力获取获取您的…

kali Linux 工具 BurpSuite-暴力破解

关于渗透的实验&#xff0c;我们大多数能在kali的工具集找到&#xff0c;其中关于抓包工具BurpSuite的使用&#xff0c;我做一个比较简单的实验————————暴力破解—————————— 暴力破解&#xff0c;顾名思义&#xff0c;就是我们把密码一个个尝试&#xff0c;只…

拒绝ssh远程暴力破解-以centos7及centos8为例

一、centos8 参考&#xff1a; 如何在CentOS 8上安装和配置Fail2ban - A5互联 - 博客园 (cnblogs.com)https://www.cnblogs.com/a5idc/p/13650056.html上面这一个讲的比较详细&#xff1a;要点摘录如下 默认的Fail2ban安装中带有两个配置文件&#xff0c;/etc/fail2ban/jail…