Example #1
0
/** 
 * 函数描述:
 * 		将指纹对象image保存到指纹数据库中,
 * 		可用的ID而且没有重复指纹保存成功后返回该指纹的ID号
 * 参数:
 *		rgb24_buf	:	24bit RGB图像缓冲区
 *		width		:	图像宽度
 *		height		:	图像高度
 *		id			:	该指纹保存的ID
 * 返回值:
 *		验证通过则返回FvsOK,否则放回FvsError_t错误码。
 **/
FvsError_t 
fp_store(FvsByte_t *rgb24_buf, FvsInt_t width, 
					FvsInt_t height, FvsInt_t *id)
{
	FvsError_t err;
	FvsInt_t goodness;
	FvsInt_t i;
	FvsImage_t image, mask;
	FvsMinutiaSet_t exist_minutias, new_minutias;

	DP("Store width : %d, height : %d.\n", width, height);
	image = ImageCreate();
	if (FvsOK != (err = ImageSetSize(image, width, height))) {
		return err;
	}
	
	if (FvsOK != (err = rgb24_to_image(rgb24_buf, image))) {
		ImageDestroy(image);
		return err;
	}
	/* process source image */
	mask   = ImageCreate();
	err = ImageSetSize(mask, ImageGetWidth(image), ImageGetHeight(image));
	if (FvsOK != err) {
		return err;
	}
	
	new_minutias = MinutiaSetCreate(MAXMINUTIA);  
	exist_minutias = MinutiaSetCreate(MAXMINUTIA);
	
	if (FvsOK != (err = img_to_minutias(image,mask,new_minutias))) {
		ImageDestroy(image);
		ImageDestroy(mask);
		MinutiaSetDestroy(new_minutias);
		MinutiaSetDestroy(exist_minutias);
		return err;
	}

/* 暂时跳过指纹重复检测 */
#if 0
	/* 保存指纹之前检查是否有指纹重复 */
	for (i = 0; i < MAX_FINGER_NO ; i++) {
		if (fdb_id_is_used(i) != ID_USED){
			continue;
		}
		if (FvsOK != (err = fdb_load_minutias(i, exist_minutias))) {
			return err;
		}
		err = MatchingCompareMinutiaSets(new_minutias, exist_minutias, &goodness);
		if (FvsOK != err) {
			return err;
		}
		if (FP_THRESHOLD >= goodness) {
			break;
		} 
	}
	if (MAX_FINGER_NO == i) {
		return FvsNoID;
	}
#endif

	if (FvsOK != (err = fdb_alloc_id(id)) ){
		ImageDestroy(image);
		ImageDestroy(mask);
		MinutiaSetDestroy(new_minutias);
		MinutiaSetDestroy(exist_minutias);
		return err;
	}
	
	fdb_id_set(*id);
	
	err = fdb_store_minutias(*id, new_minutias);
	
	ImageDestroy(image);
	ImageDestroy(mask);
	MinutiaSetDestroy(new_minutias);
	MinutiaSetDestroy(exist_minutias);

#if 0	/* 存储之后立即读出来验证 */
	new_minutias = MinutiaSetCreate(MAXMINUTIA);  
	err = fdb_load_minutias(*id, new_minutias);
	if (err ==  FvsOK) {
		DP("\tLoad after store minutias ok.\n");
	} else {
		DP("\tLoad after store minutias fail. return %d.\n", err);
	}
	MinutiaSetDestroy(new_minutias);
#endif

	return err;
}
Example #2
0
ProThread::ProThread(QString file, bool gen = false, double r = 4.0) {
    minutiaSet = MinutiaSetCreate(ProThread::defaultSetSize);
    bmpfilename = file;
    genPic = gen;
    radius = r;
}
Example #3
0
/** 
 * 函数描述:
 * 		将指纹对象image进行验证,
 * 		通过则返回匹配指纹的ID号和指纹匹配度 
 * 参数:
 *		rgb24_buf	:	24bit RGB图像缓冲区
 *		width		:	图像宽度
 *		height		:	图像高度
 *		id			:	与image匹配指纹的ID
 *		goodness	:	指纹匹配值
 * 返回值:
 *		验证通过则返回FvsOK,否则放回FvsError_t错误码。
 **/
FvsError_t 
fp_auth(FvsByte_t *rgb24_buf, FvsInt_t width, FvsInt_t height,
			FvsInt_t *id, FvsInt_t *goodness)
{
	FvsError_t err;
	FvsInt_t score;
	/* 最佳匹配使用变量 */
	FvsInt_t max_score, max_id;
	FvsInt_t i;
	FvsImage_t image, mask;
	FvsMinutiaSet_t exist_minutias, new_minutias;
	
	image = ImageCreate();
	if (FvsOK != (err = ImageSetSize(image, width, height))) {
		return err;
	}
	
	if (FvsOK != (err = rgb24_to_image(rgb24_buf, image))) {
		return err;
	}

	new_minutias = MinutiaSetCreate(MAXMINUTIA);  
	exist_minutias = MinutiaSetCreate(MAXMINUTIA);
	
	/* process source image */
	mask   = ImageCreate();
	err = ImageSetSize(mask, ImageGetWidth(image), ImageGetHeight(image));
	if (FvsOK != err) {
		return err;
	}
	
	if (FvsOK != (err = img_to_minutias(image,mask,new_minutias))) {
		return err;
	}

	/* 在算法没有对指纹进行分类之前,先使用遍历方法查找指纹特征向量 */
	max_score = 0;
	max_id = -1;
	for (i = 0; i < MAX_FINGER_NO; i++) {
		if (fdb_id_is_used(i)) {
			continue;
		}
		DP("---> Load index : %d minutia set...\n", i);
		if (FvsOK != (err = fdb_load_minutias(i, exist_minutias))) {
			goto exit_auth;
		}
		DP("----> Matching index : %d ...\n", i);
		err = MatchingCompareMinutiaSets(new_minutias, exist_minutias, &score);
		if (FvsOK != err) {
			return err;
		}
		DP("----> Match to index : %d score is : %d.\n", i, score);
		#ifdef FVS_BEST_MATCH
		/* 最佳匹配 */
		if (score >= FP_THRESHOLD) {
			if (score > max_score) {
				max_score = score;
				max_id = i;
			}
		}
		#else
		/* 首次匹配 */
		if (score >= FP_THRESHOLD) {
			*id = i;
			*goodness = score; 
			goto exit_auth;
		} 
		#endif
		
	}
	
#ifdef FVS_BEST_MATCH
	*id = max_id;
	*goodness = max_score;
#endif

exit_auth:
	ImageDestroy(image);
	ImageDestroy(mask);
	MinutiaSetDestroy(new_minutias);
	MinutiaSetDestroy(exist_minutias);
	
	return err;
}