应用笔记-Qt程序中使用Live20R指纹采集器

阅读: 评论:0

应⽤笔记-Qt程序中使⽤Live20R指纹采集器
应⽤笔记-Qt 程序中使⽤ Live 20R 指纹采集器
最近⼀个项⽬需要⽤到指纹认证。就在某东上随便搜了个销量⽐较⼤的指纹采集器,就是今天这个笔记的主⾓(Live 20R 指纹采集器)。花了⼏天时间研究明⽩了这个⼩东西是如何使⽤的。
Live 20R 指纹采集器本⾝提供了 SDK 开发包,叫做 ZKFinger SDK,我使⽤的版本是 5.0。这个 SDK ⾥提供了 ActiveX 接⼝和 C 语⾔接⼝。⽐较这两个接⼝的功能会发现 ActiveX 接⼝提供的功能更强,因此,应该优先使⽤这个接⼝。
不过我当时没仔细对⽐,直接就⽤了 SDK 中提供的 C 语⾔接⼝了。这个功能少了点,但是也够我⽤了。
简单的说,Live 20R 指纹采集器本⾝只是个指纹图像获取设备。它可以⽤来获取指纹图像。其他的功能都是 SDK 软件来实现的。因此我将功能划分到了两个 C++类中:
1. FingerprintReader
2. FingerprintCacheDB
FingerprintReader ⽤于获取指纹。FingerprintCacheDB 实现指纹⽐对等其他功能。另外还有两个辅助类:
1. FingerprintEnroll
2. FPCacheDBLoader
FingerprintEnroll 是个辅助类,⽤于简化指纹登记的代码。FPCacheDBLoader ⽤于将指纹存⼊数据库或从数据库中读出。FingerprintReader
FingerprintReader 这个类直接与硬件打交道。⽤于获取指纹。⾥⾯⽤到了⼀个线程,不停的询问Live 20R 指纹采集器是否有新的指纹,如果有则发出⼀个 Qt 信号 :void onFingerprintReceived(QImage image, QByteArray fpTemplate)。
QByteArray fpTemplate 是从指纹中提取的信息。后⾯的⽐对都是⽤的这个 fpTemplate。指纹图像在后⾯倒是没什么⽤的。这⾥之所以把指纹图像给传出来了,主要是为了在界⾯上显⽰出来,看起来⽐较的酷。
下⾯直接给代码吧,⾸先是头⽂件:
#ifndef FINGERPRINTREADER_H
#define FINGERPRINTREADER_H
#include <QObject>
#include <QThread>
#include <QImage>
#include <QString>
#include <windows.h>
namespace ZKFP
{
/**
* @brief The FingerprintReader class 这个类完成指纹采集的⼯作。指纹判别⼯作由其他类来完成。 */
class FingerprintReader : public QThread
{
Q_OBJECT
public:
explicit FingerprintReader(QObject *parent = nullptr);
~FingerprintReader();
/**
* @brief getDeviceCount 获取系统中识别出来的指纹识别器的数量
* @return
*/
int getDeviceCount();
QImage acquireImage();
QString vendorName() const;
QString productName() const;
QString serialNumber() const;
uint16_t getVID() const;
uint16_t getPID() const;
bool isFakeFuncOn();
QSize imageSize() {return QSize(m_image_width, m_image_height);}
signals:
/**
* @brief onFeatureInfo 取得指纹初始特征时发出该信号
* @param quality 表⽰该指纹特征的质量
*                0: 好的指纹特征, 1: 特征点不够, 2: 其它原因导致不能取到指纹特征, -1: 可疑
*/
void onFeatureInfo(int quality);
/**
* @brief onFingerTouching 当⼿指按压纹取像设备时发送该信号。
*/
void onFingerTouching();
/**
* @brief onFingerLeaving 当⼿离开压纹取像设备时发送该信号。
*/
void onFingerLeaving();
void onCapture(bool result);
void onFingerprintReceived(QImage image, QByteArray fpTemplate);
void fakeFinger();
public slots:
bool openDevice(int index = 0);
void closeDevice();
void beginCapture();
void cancelCapture();
/**
* @brief setFakeFunc 设置防假开关
* @param on  true 表⽰开启防假指纹功能。 false 表⽰关闭防假指纹功能。
*/
void setFakeFunc(bool on);
private:
HANDLE m_handle;
QString m_vendorName;
QString m_productName;
QString m_serialNumber;
QImage m_fpImage;
int m_image_width;
int m_image_height;
int m_image_size;
int m_image_DPI;
int m_isFakeOn;
uint16_t m_vid;
uint16_t m_pid;
bool m_init;
void run() override;
bool isRealFinger();
bool m_stop;
};
}
#endif // FINGERPRINTREADER_H
接下来是 cpp ⽂件:
#include "FingerprintReader.h"
#include "FingerprintCacheDB.h"
#include "ZKFingerReader/libs/include/libzkfp.h"
#include <QDebug>
namespace ZKFP
{
static const int ZKFP_IMAGE_WIDTH_RO = 1;
static const int ZKFP_IMAGE_HEIGHT_RO = 2;
static const int ZKFP_IMAGE_DPI_RW = 3;
static const int ZKFP_IMAGE_SIZE_RO = 106;
static const int ZKFP_VID_PID_RO = 1015;
static const int ZKFP_FAKE_ON_RW = 2002;
static const int ZKFP_REAL_FINGER_RO = 2004;
static const int ZKFP_VENDOR_NAME_RO = 1101;
static const int ZKFP_PRODUCT_NAME = 1102;
static const int ZKFP_SERIAL_NUNBER = 1103;
//static const int MAX_TEMPLATE_SIZE = 2048;
static const int ZKFP_ERR_OK = 0;
int autoInitCount = 0;
static bool autoInit()
{
if(autoInitCount == 0)
{
if( ZKFPM_Init() == 0)
{
autoInitCount ++;
return true;
}
else
{
return false;
}
}
return true;
}
static bool autoTerminate()
{
autoInitCount --;
if(autoInitCount == 0)
{
return (ZKFPM_Terminate() == 0);
}
return false;
}
FingerprintReader::FingerprintReader(QObject *parent)
: QThread(parent),
m_init(false),
m_handle(0),
m_image_height(0),
m_image_width(0),
m_image_size(0),
m_vendorName(""),
m_productName(""),
m_serialNumber(""),
m_stop(true)
{
m_init = autoInit();
qDebug() << "autoInit = " << m_init;
}
int FingerprintReader::getDeviceCount()
{
return ZKFPM_GetDeviceCount();
}
bool FingerprintReader::openDevice(int index)
{
m_handle = ZKFPM_OpenDevice(index);
if(m_handle != 0)
{
setFakeFunc(true);
unsigned int length = sizeof(int);
m_image_DPI = 500;
length = sizeof(int);
ZKFPM_SetParameters(m_handle, ZKFP_IMAGE_DPI_RW, reinterpret_cast<unsigned char *> (&m_image_DPI), length);
length = sizeof(int);
ZKFPM_GetParameters(m_handle, ZKFP_IMAGE_DPI_RW, reinterpret_cast<unsigned char *> (&m_image_DPI), &length);
ZKFPM_GetParameters(m_handle, ZKFP_IMAGE_WIDTH_RO, reinterpret_cast<unsigned char *> (&m_image_width), &length);        length = sizeof(int);
ZKFPM_GetParameters(m_handle, ZKFP_IMAGE_HEIGHT_RO, reinterpret_cast<unsigned char *> (&m_image_height), &length);        length = sizeof(int);
ZKFPM_GetParameters(m_handle, ZKFP_IMAGE_SIZE_RO, reinterpret_cast<unsigned char *> (&m_image_size), &length);
qDebug() << "image width = " << m_image_width << ", height = " << m_image_height << ", DPI = " << m_image_DPI;
char name[128] = {0};
memset(name, 0, 128);
length = 128;
ZKFPM_GetParameters(m_handle, ZKFP_VENDOR_NAME_RO, reinterpret_cast<unsigned char *>(name), &length);
m_vendorName.clear();
m_vendorName.append(name);
memset(name, 0, 128);
length = 128;
ZKFPM_GetParameters(m_handle, ZKFP_PRODUCT_NAME, reinterpret_cast<unsigned char *>(n
ame), &length);        m_productName.clear();
m_productName.append(name);
memset(name, 0, 128);
length = 128;
ZKFPM_GetParameters(m_handle, ZKFP_SERIAL_NUNBER, reinterpret_cast<unsigned char *>(name), &length);        m_serialNumber.clear();
m_serialNumber.append(name);
qDebug() << "Vendor Name = " << m_vendorName;
qDebug() << "Product Name = " << m_productName;
qDebug() << "Serial Number = " << m_serialNumber;
uint16_t vid_pid[2] = {0, 0};
length = 4;
ZKFPM_GetParameters(m_handle, ZKFP_VID_PID_RO, reinterpret_cast<unsigned char *>(vid_pid), &length);
m_vid = vid_pid[0];
m_pid = vid_pid[1];
qDebug() << "VID = " << m_vid << ", PID = " << m_pid;
return true;
}
else
{
m_vendorName.clear();
m_productName.clear();
m_serialNumber.clear();
m_vid = 0;
m_pid = 0;
}
return false;
}
bool FingerprintReader::isFakeFuncOn()
{
m_isFakeOn = 0;
unsigned int length = sizeof(m_isFakeOn);
ZKFPM_GetParameters(m_handle, ZKFP_FAKE_ON_RW, reinterpret_cast<unsigned char *>(&m_isFakeOn), &length); return m_isFakeOn;
}
void FingerprintReader::setFakeFunc(bool on)
{
int fakeON = on ? 1 : 0;
unsigned int length = sizeof(m_isFakeOn);
ZKFPM_SetParameters(m_handle, ZKFP_FAKE_ON_RW, reinterpret_cast<unsigned char *> (&fakeON), sizeof(int));    ZKFPM_GetParameters(m_handle, ZKFP_FAKE_ON_RW, reinterpret_cast<unsigned char *>(&m_isFakeOn), &length); }
void FingerprintReader::closeDevice()
{
if(isRunning())
{
cancelCapture();
}
if(m_handle)
{
ZKFPM_CloseDevice(m_handle);
m_vendorName.clear();
m_productName.clear();
m_serialNumber.clear();
m_image_height = 0;
m_image_width = 0;
m_image_size = 0;

本文发布于:2023-05-09 22:15:11,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/2/93379.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指纹   功能   特征
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图