将开源虹膜识别算法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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/352816

相关文章

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Windows自动化Python pyautogui RPA操作实现

《Windows自动化PythonpyautoguiRPA操作实现》本文详细介绍了使用Python的pyautogui库进行Windows自动化操作的实现方法,文中通过示例代码介绍的非常详细,对大... 目录依赖包睡眠:鼠标事件:杀死进程:获取所有窗口的名称:显示窗口:根据图片找元素:输入文字:打开应用:依

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

Python使用pysmb库访问Windows共享文件夹的详细教程

《Python使用pysmb库访问Windows共享文件夹的详细教程》本教程旨在帮助您使用pysmb库,通过SMB(ServerMessageBlock)协议,轻松连接到Windows共享文件夹,并列... 目录前置条件步骤一:导入必要的模块步骤二:配置连接参数步骤三:实例化SMB连接对象并尝试连接步骤四:

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖