⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vf_feature.h

📁 指纹模式识别算法接口
💻 H
字号:
#ifndef	__VFFEATURE_H__
#define __VFFEATURE_H__

#include "VF_Type.h"
#include "VF_Global.h"

//
//	EncodeFeature: 对指纹特征进行压缩编码
//
sint32	EncodeFeature(FEATUREPTR lpFeature, uint8 *lpData)
{
/////////////////////////////////////////////////////////////////////
//	lpFeature: [in] 要编码的指纹特征指针
//  lpData: [out] 压缩编码后的指纹特征缓冲区指针
/////////////////////////////////////////////////////////////////////
	sint32	i;
	sint32	totalLen = 0;
	sint32	len = 0;
	sint32	x, y, o;
	uint8	v, t, mn;
	sint32  boSize = 0;

	if(lpData == NULL || lpFeature == NULL)
		return 0;
	
	// 特征点数目
	mn = (uint8)lpFeature->MinutiaNum;
	// 特征总长度
	totalLen = 4 + 7*mn;
	// 第一个字节为特征总长度
	lpData[0] = (uint8)(totalLen / 256);
	lpData[1] = (uint8)(totalLen-lpData[0]*256);

	// 第二个字节为特征点数目
	lpData[2] = mn;

	len = 3;
	
	// 对每个特征点进行压缩
	for(i = 0; i < mn; i++)
	{
		x = lpFeature->MinutiaArr[i].x;		// 10位表示
		y = lpFeature->MinutiaArr[i].y;		// 10位表示
		o = lpFeature->MinutiaArr[i].Direction; // 9位表示
		t = (uint8)lpFeature->MinutiaArr[i].Type;	// 3位表示
		lpData[len] = (uint8)(x >> 2);
		lpData[len+1] = (uint8)((x & 0x3) << 6) + (uint8)(y >> 4);
		lpData[len+2] = (uint8)((y & 0xF) << 4) + (uint8)(o >> 5);
		lpData[len+3] = (uint8)((o & 0x1F) << 3) + (uint8)(t & 0x7);
		lpData[len+4] = (uint8)lpFeature->MinutiaArr[i].Triangle[0];
		lpData[len+5] = (uint8)lpFeature->MinutiaArr[i].Triangle[1];
		lpData[len+6] = (uint8)lpFeature->MinutiaArr[i].Triangle[2];

		len += 7;
	}
	
	// 计算校验位
	v = 0;
	for(i = 0; i < totalLen-1; i++)
	{
		v = v ^ lpData[i];
	}
	// 最后一个字节放校验字节
	lpData[len] = v;


	return totalLen;
}

//
//	DecodeFeature: 对指纹特征进行解码
//
sint32	DecodeFeature(uint8 *lpData, FEATUREPTR lpFeature)
{
/////////////////////////////////////////////////////////////////////
//  lpData: [in] 压缩编码的指纹特征缓冲区指针
//	lpFeature: [out] 解码后的指纹特征指针
/////////////////////////////////////////////////////////////////////
	sint32	i;
	sint32	totalLen = 0;
	sint32	len = 0;
	uint8	v;
	sint32	boSize = 0;
	if(lpData == NULL || lpFeature == NULL)
		return 1;

	memset((void *)lpFeature, 0, sizeof(FEATURE));
	// 第一个字节为特征总长
	totalLen = (sint32)(lpData[0]*256 + lpData[1]);
	// 计算校验位
	v = 0;
	for(i = 0; i < totalLen; i++)
	{
		v = v ^ lpData[i];
	}
	if(v != 0)	// 校验失败则返回错误
		return 2;

	// 第二个字节为指纹特征点数目
	lpFeature->MinutiaNum = (uint8)lpData[2]; 
	
	len = 3;

	// 解码
	for(i = 0; i < lpFeature->MinutiaNum; i++)
	{
		lpFeature->MinutiaArr[i].x = (sint32)(((sint32)lpData[len])<<2) + 
								   (sint32)(((sint32)(lpData[len+1] & 0xC0))>>6);
		lpFeature->MinutiaArr[i].y = (sint32)(((sint32)(lpData[len+1] & 0x3F))<<4) + 
			                       (sint32)(((sint32)(lpData[len+2] & 0xF0))>>4);
		lpFeature->MinutiaArr[i].Direction = (sint32)(((sint32)(lpData[len+2] & 0xF))<<5) + 
			                       (sint32)(((sint32)(lpData[len+3] & 0xF8))>>3);
		lpFeature->MinutiaArr[i].Type = (uint8)(lpData[len+3] & 0x7);
		lpFeature->MinutiaArr[i].Triangle[0] = lpData[len+4];
		lpFeature->MinutiaArr[i].Triangle[1] = lpData[len+5];
		lpFeature->MinutiaArr[i].Triangle[2] = lpData[len+6];

		len += 7;
	}

	return 0;
}


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -