eagler8 发表于 2020-2-18 11:46:44

指纹识别过程
分为两个次要过程,分为四个部分。两个次要的过程是指纹记录和交叉核对过程。指纹记录过程由四个部分组成:指纹采集、指纹预处理、指纹检查和指纹模板采集。指纹比对过程还包括四个部分:指纹采集、指纹预处理、指纹特征比对和匹配。在这两个过程中,指纹图像的前处理都存在,但指纹图像的取值和指纹 特征的值似乎有相同的名称,但它们的内在算法和性质是完全不同的。在引入指纹的过程中,更频繁地获得指纹图像,而单值提取部分的算法更多地关注一些特征值的辨析和获取过程。

指纹识别的第一步是指纹图像的获取,目前已经有多种指纹图像的获取方式,主要有光学指纹采集技术、电容式传感器指纹采集、温度传感指纹获取技术、超声波指纹采集技术、电磁波指纹采集技术,获得图像后进行预处理加工,要实现图像的灰度变换、分割、均衡化、增强、 细化等预处理步骤。首先要把指纹从整个图案上分割出来, 背景图和指纹分布图的灰度是不同的,这就确定了两者强度的区别, 利用梯度这个概念就能将指纹从背景图中很好的分离开;均衡化是预 处理中的重要一步,在提取时根据环境的不同得到的指纹图像不同区域的像素分布点是不同的,均衡化就是将不同区域分布的像素进行均值划分得到亮度分布均衡的图像;为了便于特征的提取,在几步加工后的图像还要智能化增强,Daugmann实现了利用Gabor小波逼近的方法使指纹图像的纹路线条更加清晰,即白的部分更白,黑的部分更黑,线条的边缘分布更加平滑。



对于处理好的指纹图像,指纹的纹路已经十分清晰,要进行指纹识别必须要进行特征提取,分离出那些具体的特征点来代替不同的纹路,首先提取指纹的特征端点和叉点,将端点叉点图像进行九宫格分割,利用指纹特征分布的灰度值是不同的这个特性,将指纹图像的端点和叉点分离出来,对于奇异点的提取利用Poincare公式,利用这个公式提取方向场周围剧烈变化的点,我们在计算机中使用不同的算法分别实现各个特征点的提取过程。

最后将识别的指纹分类操作,指纹的分类是用采集的指纹特征与数据库中保存的指纹特征相比较,判断是否属于同一指纹,首先根据指纹的纹形进行粗匹配,进而利用指纹形态和细节特征进行精确匹配给出相比较指纹的相似性程度。根据应用的不同,对指纹的相似性得分进行排序或给出是否为同一指纹的判决结果,指纹对比有两种方式: 一对一比对是根据用户从数据库中检索出待对比的用户指纹,再与新采集的指纹比对;一对多比对是新采集的指纹和数据库中的所有指纹逐一比对。

eagler8 发表于 2020-2-18 15:55:58

模块接口
采用 8 芯 1.25 mm 间距单排插座,模块内部内置了手指探测电路,用户可读取状态引脚TCH(WAK)判断有无手指按下。

引脚号名称   类型      功能描述
1            Vi            In      模块电源正输入端+3.3V(请勿接3.3V以上电源,否则烧毁模块!)         
2         TX            Out      串行数据输出,接MCU或TTL串口的RX。
3         RX             In      串行数据输入,接MCU或TTL串口的TX。
4          GND         -      信号地。内部与电源地连接。
5          TCH          Out      感应信号输出,默认高电平有效
6          UA            In         触摸感应电源输入端,3.3v供电
7          D+         -          USB D+
8          D-         -         USB D-
(7脚,8脚为USB信号线,使用串口控制模块时可以悬空不用)

eagler8 发表于 2020-2-18 16:09:01

PCB 如图



eagler8 发表于 2020-2-18 18:47:49

实验之一:Adafruit指纹传感器,更改密码示例
安装库:IDE—工具—管理库—搜索Adafruit-Fingerprint-Sensor-Library—安装
实验接线:
Vi      +3.3V(请勿接3.3V以上电源,否则烧毁模块!)         
TX      2   
RX      3
GND    GND

eagler8 发表于 2020-2-18 18:53:06

/*
【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验一百五十:AS608光学指纹识别模块 智能锁/考勤门禁开发/指纹采集模块
实验之一:Adafruit指纹传感器,更改密码示例
安装库:IDE—工具—管理库—搜索Adafruit-Fingerprint-Sensor-Library—安装
实验接线:
Vi      +3.3V(请勿接3.3V以上电源,否则烧毁模块!)
TX      2
RX      3
GND    GND
*/

#include <Adafruit_Fingerprint.h>

// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1

// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino(WHITE wire)
// comment these two lines if using hardware serial
SoftwareSerial mySerial(2, 3);

// Using sensor without password
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

// Using sensor with password
//Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial, 1337);

void setup()
{
while (!Serial);// For Yun/Leo/Micro/Zero/...

Serial.begin(9600);
Serial.println("Adafruit fingerprint sensor, change password example");

// set the data rate for the sensor serial port
finger.begin(19200);

if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
} else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1);
}

Serial.print("Set password... ");
uint8_t p = finger.setPassword(1337);
if (p == FINGERPRINT_OK) {
    Serial.println("OK"); // Password is set
} else {
    Serial.println("ERROR"); // Failed to set password
}
}

void loop()
{

}

eagler8 发表于 2020-2-18 19:02:11

eagler8 发表于 2020-2-18 19:04:14



找不到指纹传感器

wing 发表于 2020-2-19 16:46:29

介绍得非常详细
mark

eagler8 发表于 2020-2-20 10:17:26

wing 发表于 2020-2-19 16:46
介绍得非常详细
mark

谢谢鼓励,正在学习中

eagler8 发表于 2020-2-21 16:41:05

/*
【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验一百五十:AS608光学指纹识别模块 智能锁/考勤门禁开发/指纹采集模块

实验之二:输入序号,注册指纹示例
安装库:IDE—工具—管理库—搜索Adafruit-Fingerprint-Sensor-Library—安装
实验接线:
Vi      +3.3V(请勿接3.3V以上电源,否则烧毁模块!)
TX      2
RX      3
GND    GND
*/

#include <Adafruit_Fingerprint.h>

// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1

// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino(WHITE wire)
// comment these two lines if using hardware serial
SoftwareSerial mySerial(2, 3);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

uint8_t id;

void setup()
{
Serial.begin(9600);
while (!Serial);// For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit Fingerprint sensor enrollment");

// 设置传感器串行端口的数据速率
finger.begin(57600);

if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
} else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
}
}

uint8_t readnumber(void) {
uint8_t num = 0;

while (num == 0) {
    while (! Serial.available());
    num = Serial.parseInt();
}
return num;
}

void loop()                      // 循环执行
{
Serial.println("Ready to enroll a fingerprint!");
Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");
id = readnumber();
if (id == 0) {// ID #0 not allowed, try again!
   return;
}
Serial.print("Enrolling ID #");
Serial.println(id);

while (!getFingerprintEnroll() );
}

uint8_t getFingerprintEnroll() {

int p = -1;
Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);
while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
}

// OK success!

p = finger.image2Tz(1);
switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
}

Serial.println("Remove finger");
delay(2000);
p = 0;
while (p != FINGERPRINT_NOFINGER) {
    p = finger.getImage();
}
Serial.print("ID "); Serial.println(id);
p = -1;
Serial.println("Place same finger again");
while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.print(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
}

// OK success!

p = finger.image2Tz(2);
switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
}

// OK converted!
Serial.print("Creating model for #");Serial.println(id);

p = finger.createModel();
if (p == FINGERPRINT_OK) {
    Serial.println("Prints matched!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("Fingerprints did not match");
    return p;
} else {
    Serial.println("Unknown error");
    return p;
}   

Serial.print("ID "); Serial.println(id);
p = finger.storeModel(id);
if (p == FINGERPRINT_OK) {
    Serial.println("Stored!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
} else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("Could not store in that location");
    return p;
} else if (p == FINGERPRINT_FLASHERR) {
    Serial.println("Error writing to flash");
    return p;
} else {
    Serial.println("Unknown error");
    return p;
}   
}

eagler8 发表于 2020-2-21 17:15:04

Adafruit指纹传感器注册
找到指纹传感器!
准备注册指纹!
请键入要将此手指另存为……

eagler8 发表于 2020-2-22 06:25:54

eagler8 发表于 2020-2-22 08:17:50

注册ID#1
等待有效手指注册为1
.
.
.
……拍摄的图像
图像转换
取下手指
身份证1
再次放置同一个手指
……拍摄的图像
图像转换
为1创建模型
指纹匹配!
身份证1
存储!
等待有效手指注册为1

eagler8 发表于 2020-2-22 09:18:00

补充:安装Adafruit指纹传感器库

使用Arduino控制指纹传感器模块的最简单方法是使用该传感器的Adafruit库。按照下面的说明安装库:

传感器的Adafruit库下载地址(含eroll文件)

https://github.com/IT-XIAOXIAO/Adafrui



首先下载Adafruit指纹传感器库。下载完成后,您将得到一个.zip文件;

解压缩.zip文件,你会看到一个Adafruit-Fingerprint-Sensor-Library-master文件夹;

将Adafruit-Fingerprint-Sensor-Library-master文件夹重命名为Adafruit_Fingerprint_Sensor_Library文件夹;

将文件夹移动到您的Arduino IDE安装库文件夹;

最后,重新打开Arduino IDE。



eagler8 发表于 2020-2-22 09:58:59

/*
【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验一百五十:AS608光学指纹识别模块 智能锁/考勤门禁开发/指纹采集模块

实验之三:查找一个匹配的指纹
安装库:IDE—工具—管理库—搜索Adafruit-Fingerprint-Sensor-Library—安装
实验接线:
Vi      +3.3V(请勿接3.3V以上电源,否则烧毁模块!)
TX      2
RX      3
GND    GND
*/

#include <Adafruit_Fingerprint.h>

// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1

// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino(WHITE wire)
// comment these two lines if using hardware serial
SoftwareSerial mySerial(2, 3);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()
{
Serial.begin(9600);
while (!Serial);// For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit finger detect test");

// set the data rate for the sensor serial port
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
} else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
}

finger.getTemplateCount();
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
}

void loop()                     // run over and over again
{
getFingerprintIDez();
delay(50);            //don't ned to run this at full speed.
}

uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
}

// OK success!

p = finger.image2Tz();
switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
}

// OK converted!
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
} else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    return p;
} else {
    Serial.println("Unknown error");
    return p;
}   

// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);

return finger.fingerID;
}

// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK)return -1;

p = finger.image2Tz();
if (p != FINGERPRINT_OK)return -1;

p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK)return -1;

// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}
页: 1 [2] 3 4
查看完整版本: 【Arduino】168种传感器系列实验(151)--AS608光学指纹识别模块