将开源虹膜识别算法OSIRIS4.1移植到Windows

2023-11-05 22:20

本文主要是介绍将开源虹膜识别算法OSIRIS4.1移植到Windows,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开源虹膜识别算法OSIRIS是在Linux下运行的,为了介绍给众多windows平台下的开发者,这里简述一下如何把它移植到windows。


开发平台Windows XP + Visual Studio 2008 + OpenCV2.3.1

1.新建一个对话框工程,将OSIRIS源码中的如下文件拷贝过去并添加到工程:

OsiCircle.cpp/.h
OsiEye.cpp/.h
OsiManager.cpp/.h
OsiProcessings.cpp/.h
OsiStringUtils.h

2.在上述源码中,只需要对OsiManager.cpp/.h做少量修改即可使用了:

OsiManager.cpp

#include <fstream>
#include <iterator>
#include <stdexcept>
#include "OsiManager.h"
#include "OsiStringUtils.h"

using namespace std ;

namespace osiris
{
OsiManager::OsiManager ( )
{
initConfiguration() ;

loadGaborFilters() ;
loadApplicationPoints() ;
}OsiManager::~OsiManager ( )
{if ( mpApplicationPoints ){cvReleaseMat(&amp;mpApplicationPoints) ;}for ( int f = 0 ; f &lt; mGaborFilters.size() ; f++ ){cvReleaseMat(&amp;mGaborFilters[f]) ;}
}void OsiManager::initConfiguration ( )
{// Options of processingmProcessSegmentation = false ;mProcessNormalization = false ;mProcessEncoding = false ;mProcessMatching = false ;mUseMask = true ;// InputsmListOfImages.clear() ;mFilenameListOfImages = "" ;mInputDirOriginalImages = "./SourceImage/" ;mInputDirMasks = "" ;mInputDirParameters = "" ;mInputDirNormalizedImages = "" ;mInputDirNormalizedMasks = "./NormalizedMasks/" ;mInputDirIrisCodes = "./IrisCodes/" ;// OutputsmOutputDirSegmentedImages = "./SegmentedImages/" ;mOutputDirParameters = "./CircleParameters/" ;mOutputDirMasks = "./Masks/" ;mOutputDirNormalizedImages = "./NormalizedImages/" ;mOutputDirNormalizedMasks = "./NormalizedMasks/" ;mOutputDirIrisCodes = "./IrisCodes/" ;mOutputFileMatchingScores = "" ;// ParametersmMinPupilDiameter = 50 ;mMaxPupilDiameter = 160 ;mMinIrisDiameter = 160 ;mMaxIrisDiameter = 280 ;mWidthOfNormalizedIris = 512 ;mHeightOfNormalizedIris = 64 ;mFilenameGaborFilters = "./filters.txt" ;mFilenameApplicationPoints = "./points.txt" ;mGaborFilters.clear() ;mpApplicationPoints = 0 ;// Suffix for filenamesmSuffixSegmentedImages = "_segm.bmp" ;mSuffixParameters = "_para.txt" ;mSuffixMasks = "_mask.bmp" ;mSuffixNormalizedImages = "_imno.bmp" ;mSuffixNormalizedMasks = "_mano.bmp" ;mSuffixIrisCodes = "_code.bmp" ;
}void OsiManager::loadGaborFilters ( )
{
//不修改
}void OsiManager::loadApplicationPoints ( )
{
//不修改
}int OsiManager::processEye ( const string &amp; rFileName , OsiEye &amp; rEye )
{// Strings handleOsiStringUtils osu ;// Get eye namestring short_name = osu.extractFileName(rFileName);rEye.loadOriginalImage(mInputDirOriginalImages+rFileName); /// SEGMENTATION : process, loadrEye.segment(mMinIrisDiameter,mMinPupilDiameter,mMaxIrisDiameter,mMaxPupilDiameter) ;// Save segmented imagerEye.saveSegmentedImage(mOutputDirSegmentedImages+short_name+mSuffixSegmentedImages) ;/// NORMALIZATION : process, loadrEye.normalize(mWidthOfNormalizedIris,mHeightOfNormalizedIris) ;/// ENCODING : process, loadrEye.encode(mGaborFilters) ;/// SAVE// Save parametersrEye.saveParameters(mOutputDirParameters+short_name+mSuffixParameters) ;// Save maskrEye.saveMask(mOutputDirMasks+short_name+mSuffixMasks) ;// Save normalized imagerEye.saveNormalizedImage(mOutputDirNormalizedImages+short_name+mSuffixNormalizedImages) ;// Save normalized maskrEye.saveNormalizedMask(mOutputDirNormalizedMasks+short_name+mSuffixNormalizedMasks) ;// Save iris coderEye.saveIrisCode(mOutputDirIrisCodes+short_name+mSuffixIrisCodes) ;  return 0;
} // end of functionint OsiManager::loadEye ( const string &amp; rFileName , OsiEye &amp; rEye )
{OsiStringUtils osu ;string short_name = osu.extractFileName(rFileName) ;// Load normalized maskrEye.loadNormalizedMask(mInputDirNormalizedMasks+short_name+mSuffixNormalizedMasks) ;// Load iris coderEye.loadIrisCode(mInputDirIrisCodes+short_name+mSuffixIrisCodes) ;return 0;
} // end of functionvoid OsiManager::process(string filename)
{try{OsiEye eye ;processEye(filename, eye) ;  }catch ( exception &amp; e ){cout &lt;&lt; e.what() &lt;&lt; endl ;                }
}float OsiManager::match(string filename1, string filename2)
{float val = 0;try{OsiEye eye1, eye2 ;loadEye(filename1, eye1) ;  loadEye(filename2, eye2) ; val = eye1.match(eye2, mpApplicationPoints);}catch ( exception &amp; e ){cout &lt;&lt; e.what() &lt;&lt; endl ;                }return val;
}

} // end of namespace


OsiManager.h

#ifndef OSI_MANAGER_H
#define OSI_MANAGER_H

#include <iostream>
#include <vector>
#include “highgui.h”
#include “OsiEye.h”

namespace osiris
{
class OsiManager
{
public :
OsiManager ( ) ;
~OsiManager ( ) ;

void process(std::string filename);
float match(std::string filename1, std::string filename2);</code></pre><pre><code class="language-cpp">    private ://private变量不修改// Private methods//void initConfiguration ( ) ;void loadGaborFilters ( ) ;void loadApplicationPoints ( ) ;int processEye ( const std::string &amp; rFileName , OsiEye &amp; rEye );
int loadEye ( const std::string &amp; rFileName , OsiEye &amp; rEye );
} ; // End of class

} // End of namespace
#endif

可见,主要是增加了两个接口函数process()和match(),分别用于虹膜计算和虹膜对比;

3.在对话框程序中新建一个button:


void CosirismfcDlg::OnBnClickedButton1()
{
cvNamedWindow(“img”, 1);
cvNamedWindow(“segment”, 1);

IplImage* img1 = cvLoadImage( "./SourceImage/S5000R00.jpg", CV_LOAD_IMAGE_GRAYSCALE );
cvShowImage( "img", img1 );
theManager.process("S5000R00.jpg");
IplImage* seg1 = cvLoadImage( "./SegmentedImages/S5000R00_segm.bmp", CV_LOAD_IMAGE_COLOR );
cvShowImage( "segment", seg1 );cvNamedWindow("img2", 1);
cvNamedWindow("segment2", 1);
IplImage* img2 = cvLoadImage( "./SourceImage/S5000R01.jpg", CV_LOAD_IMAGE_GRAYSCALE );
cvShowImage( "img2", img2 );
theManager.process("S5000R01.jpg");
IplImage* seg2 = cvLoadImage( "./SegmentedImages/S5000R01_segm.bmp", CV_LOAD_IMAGE_COLOR );
cvShowImage( "segment2", seg2 );if (theManager.match("S5000R00.jpg","S5000R01.jpg") &lt; 0.32)MessageBox("S5000R00 and S5000R01 is same person");cvNamedWindow("img3", 1);
cvNamedWindow("segment3", 1);
IplImage* img3 = cvLoadImage( "./SourceImage/S5001R01.jpg", CV_LOAD_IMAGE_GRAYSCALE );
cvShowImage( "img3", img3 );
theManager.process("S5001R01.jpg");
IplImage* seg3 = cvLoadImage( "./SegmentedImages/S5001R01_segm.bmp", CV_LOAD_IMAGE_COLOR );
cvShowImage( "segment3", seg3 );if (theManager.match("S5000R00.jpg","S5001R01.jpg") &gt; 0.32)MessageBox("S5000R00 and S5001R01 is not same person");

}

该button读取两张来自同一个人的虹膜图像,对比结果应当小于0.32;读取两张不同人的虹膜图像,对比结果应当大于0.32。

虹膜识别都要先进行process步骤,再进行match步骤。


4.把工程属性修改为不使用预编译头,编译;


5.在Release或Debug目录下新建如下几个文件夹:

CircleParameters
IrisCodes
Masks
NormalizedImages
NormalizedMasks
SegmentedImages
SourceImage

向SourceImage目录中拷贝如下示例虹膜图像:
S5000R00.bmp
S5000R01.bmp
S5000R02.bmp
S5001R00.bmp
S5001R01.bmp
S5001R02.bmp

并从OSIRIS源码中拷贝如下两个文件:
filters.txt
points.txt

然后就可运行exe文件了,运行结果:




本文完整工程可在qq群里下载:
虹膜识别算法研究QQ群:422376177
扫码加入:


这篇关于将开源虹膜识别算法OSIRIS4.1移植到Windows的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/zqx951102/article/details/82889591
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/352816

相关文章

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Python+Tkinter实现Windows Hosts文件编辑管理工具

《Python+Tkinter实现WindowsHosts文件编辑管理工具》在日常开发和网络调试或科学上网场景中,Hosts文件修改是每个开发者都绕不开的必修课,本文将完整解析一个基于Python... 目录一、前言:为什么我们需要专业的Hosts管理工具二、工具核心功能全景图2.1 基础功能模块2.2 进

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解