<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Julio Chinchilla</title>
    <description>The latest articles on Forem by Julio Chinchilla (@juliofcv).</description>
    <link>https://forem.com/juliofcv</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1156790%2F2096b5d9-44f0-45ad-8d78-adb45f02c6d9.png</url>
      <title>Forem: Julio Chinchilla</title>
      <link>https://forem.com/juliofcv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/juliofcv"/>
    <language>en</language>
    <item>
      <title>TemplateScorer</title>
      <dc:creator>Julio Chinchilla</dc:creator>
      <pubDate>Tue, 16 Sep 2025 04:35:06 +0000</pubDate>
      <link>https://forem.com/juliofcv/templatescorer-4d4k</link>
      <guid>https://forem.com/juliofcv/templatescorer-4d4k</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy28cdn8myngm0ho6olwo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy28cdn8myngm0ho6olwo.png" alt="SCORERS" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TemplateScorer&lt;/strong&gt; is a Java algorithm that calculates a &lt;strong&gt;quality score&lt;/strong&gt; for fingerprint templates in ISO/IEC 19794 format.&lt;br&gt;&lt;br&gt;
It combines robust statistics, multivariate analysis, and spatial metrics to produce a single value that reflects the &lt;strong&gt;geometric and directional consistency&lt;/strong&gt; of the minutiae.&lt;/p&gt;


&lt;h2&gt;
  
  
  Project Repository
&lt;/h2&gt;

&lt;p&gt;You can find the full project here: &lt;a href="https://github.com/juliofcv/TemplateScorer" rel="noopener noreferrer"&gt;GitHub - TemplateScorer&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Description
&lt;/li&gt;
&lt;li&gt;
Dependencies
&lt;/li&gt;
&lt;li&gt;
Usage
&lt;/li&gt;
&lt;li&gt;
Implementation Details

&lt;ul&gt;
&lt;li&gt;
Constants
&lt;/li&gt;
&lt;li&gt;
scoreTemplate(ReadISO19794 template)
&lt;/li&gt;
&lt;li&gt;
calculateWeights(List raw)
&lt;/li&gt;
&lt;li&gt;
extractAngles &amp;amp; extractPoints
&lt;/li&gt;
&lt;li&gt;
calculateRobustCentroid
&lt;/li&gt;
&lt;li&gt;
validateResolution
&lt;/li&gt;
&lt;li&gt;
normalizePoints &amp;amp; calculateScaleFactor
&lt;/li&gt;
&lt;li&gt;
computePCAAlignment
&lt;/li&gt;
&lt;li&gt;
rotatePoints
&lt;/li&gt;
&lt;li&gt;
geometricMedian
&lt;/li&gt;
&lt;li&gt;
covariance
&lt;/li&gt;
&lt;li&gt;
calculateMahalanobisDistances
&lt;/li&gt;
&lt;li&gt;
calculateTrimmedMean
&lt;/li&gt;
&lt;li&gt;
calculateQuadrantScore
&lt;/li&gt;
&lt;li&gt;
calculateOrientationEntropy
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Description
&lt;/h2&gt;

&lt;p&gt;The overall scoring pipeline is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read minutiae&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weighting&lt;/strong&gt; based on quality
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compute robust centroid&lt;/strong&gt; (geometric median)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spatial normalization&lt;/strong&gt; and &lt;strong&gt;PCA alignment&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compute Mahalanobis distances&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trimmed mean&lt;/strong&gt; of distances
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weighting&lt;/strong&gt; by orientation entropy and spatial distribution (quadrants)
&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Dependencies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Java 8+&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;com.gd.bioutils.read.ReadISO19794&lt;/code&gt; (read ISO 19794 templates)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;com.gd.bioutils.entity.Minutiae&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.gd.bioutils.read.ReadISO19794&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.gd.bioutils.scoring.TemplateScorer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ReadISO19794&lt;/span&gt; &lt;span class="n"&gt;tpl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ReadISO19794&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fingerprint.iso19794"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TemplateScorer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scoreTemplate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tpl&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Template score: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Implementation Details
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Constants
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Constant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEFAULT_RESOLUTION = 500.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default resolution (ppi) if &lt;code&gt;xRes&lt;/code&gt; or &lt;code&gt;yRes&lt;/code&gt; are out of bounds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MIN_RESOLUTION_THRESHOLD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Minimum valid resolution value (100 ppi).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAX_RESOLUTION_THRESHOLD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maximum valid resolution value (10000 ppi).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MIN_QUALITY_WEIGHT = 0.01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Minimum weight for a minutia (if &lt;code&gt;quality/100&lt;/code&gt; is lower).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TRIM_RATIO = 0.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fraction of data trimmed when computing mean (10%).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HIST_BINS = 12&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of bins for the angle histogram.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BETA = 0.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Weight factor for orientation entropy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAX_MEDIAN_ITER = 10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maximum iterations for geometric median algorithm.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MEDIAN_TOL = 1e-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Convergence tolerance for geometric median.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;scoreTemplate(ReadISO19794 template)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Processes a complete template:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extracts &lt;strong&gt;minutiae&lt;/strong&gt;, &lt;strong&gt;weights&lt;/strong&gt;, &lt;strong&gt;angles&lt;/strong&gt;, and &lt;strong&gt;coordinates&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Computes &lt;strong&gt;robust centroid&lt;/strong&gt; (geometric median) with &lt;code&gt;geometricMedian&lt;/code&gt;&lt;sup id="fnref1"&gt;1&lt;/sup&gt;.
&lt;/li&gt;
&lt;li&gt;Validates and normalizes resolution (&lt;code&gt;validateResolution&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Centers and &lt;strong&gt;normalizes&lt;/strong&gt; points with scale factor (&lt;code&gt;normalizePoints&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Aligns with &lt;strong&gt;PCA&lt;/strong&gt; (&lt;code&gt;computePCAAlignment&lt;/code&gt;)&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;sup id="fnref3"&gt;3&lt;/sup&gt;.
&lt;/li&gt;
&lt;li&gt;Rotates points by PCA angle (&lt;code&gt;rotatePoints&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Computes &lt;strong&gt;Mahalanobis distances&lt;/strong&gt; (&lt;code&gt;calculateMahalanobisDistances&lt;/code&gt;)&lt;sup id="fnref4"&gt;4&lt;/sup&gt;.
&lt;/li&gt;
&lt;li&gt;Gets &lt;strong&gt;trimmed mean&lt;/strong&gt; of distances (&lt;code&gt;calculateTrimmedMean&lt;/code&gt;)&lt;sup id="fnref5"&gt;5&lt;/sup&gt;.
&lt;/li&gt;
&lt;li&gt;Computes &lt;strong&gt;quadrantScore&lt;/strong&gt; (spatial distribution).
&lt;/li&gt;
&lt;li&gt;Computes &lt;strong&gt;orientationEntropy&lt;/strong&gt; (angle entropy) (&lt;code&gt;calculateOrientationEntropy&lt;/code&gt;)&lt;sup id="fnref6"&gt;6&lt;/sup&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final combination:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;score = globalScore * (1 + BETA * orientationEntropy) * quadrantScore
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;calculateWeights(List&amp;lt;Minutiae&amp;gt; raw)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Converts each minutia quality (0–100) into a weight within [MIN_QUALITY_WEIGHT, 1].&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;extractAngles&lt;/code&gt; &amp;amp; &lt;code&gt;extractPoints&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Reads angle and coordinates &lt;code&gt;(x,y)&lt;/code&gt; of each minutia.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;calculateRobustCentroid&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Calls &lt;code&gt;geometricMedian(points, weights)&lt;/code&gt; to find the point minimizing &lt;strong&gt;weighted distance sum&lt;/strong&gt;&lt;sup id="fnref1"&gt;1&lt;/sup&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;validateResolution&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Ensures &lt;code&gt;xRes&lt;/code&gt; and &lt;code&gt;yRes&lt;/code&gt; are within [MIN_RESOLUTION_THRESHOLD, MAX_RESOLUTION_THRESHOLD].&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;normalizePoints&lt;/code&gt; &amp;amp; &lt;code&gt;calculateScaleFactor&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Computes a &lt;strong&gt;robust scale factor&lt;/strong&gt; based on distances to centroid and weights.
&lt;/li&gt;
&lt;li&gt;Shifts and divides by resolution and scale to standardize.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;computePCAAlignment&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Computes &lt;strong&gt;first principal component&lt;/strong&gt; from covariance matrix&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;sup id="fnref3"&gt;3&lt;/sup&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;covXX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Σ&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="err"&gt;²&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;covXY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Σ&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="err"&gt;·&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;covYY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Σ&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="err"&gt;²&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;atan2&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;·&lt;/span&gt;&lt;span class="n"&gt;covXY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;covXX&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;covYY&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;rotatePoints&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Rotates each point &lt;code&gt;(x,y)&lt;/code&gt; by &lt;code&gt;angle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x' = x·cos – y·sin;  y' = x·sin + y·cos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;geometricMedian&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Implements &lt;strong&gt;Weiszfeld’s algorithm&lt;/strong&gt; (weighted geometric median)&lt;sup id="fnref1"&gt;1&lt;/sup&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;iter&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="nl"&gt;MAX_MEDIAN_ITER:&lt;/span&gt;
  &lt;span class="n"&gt;inv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;MEDIAN_TOL&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Σ&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="err"&gt;·&lt;/span&gt;&lt;span class="n"&gt;inv&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="no"&gt;Σ&lt;/span&gt; &lt;span class="n"&gt;inv&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="err"&gt;‖&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="err"&gt;–&lt;/span&gt;&lt;span class="n"&gt;median&lt;/span&gt;&lt;span class="err"&gt;‖&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;MEDIAN_TOL&lt;/span&gt; &lt;span class="err"&gt;⇒&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;covariance&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Weighted covariance matrix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c00 = Σ w·dx² / Σw;  c01 = Σ w·dx·dy / Σw;  c11 = Σ w·dy² / Σw;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;calculateMahalanobisDistances&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Inverts covariance matrix and computes
&lt;code&gt;d² = [x y]·Cov⁻¹·[x; y]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Distance = √max(d², 0)
&lt;/li&gt;
&lt;li&gt;Sorts ascendingly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;calculateTrimmedMean&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sorts distances
&lt;/li&gt;
&lt;li&gt;Removes &lt;code&gt;⌊n·TRIM_RATIO⌋&lt;/code&gt; from both ends
&lt;/li&gt;
&lt;li&gt;Returns mean of remaining values (robust statistic)&lt;sup id="fnref5"&gt;5&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;calculateQuadrantScore&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Splits bounding box into &lt;code&gt;k×k&lt;/code&gt; sub-quadrants (&lt;code&gt;k=3&lt;/code&gt;), computes trimmed mean of distances to origin per block, and returns geometric root of their product.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;calculateOrientationEntropy&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Counts angle frequencies into &lt;code&gt;HIST_BINS&lt;/code&gt; bins
&lt;/li&gt;
&lt;li&gt;Computes Shannon entropy&lt;sup id="fnref6"&gt;6&lt;/sup&gt;:
&lt;code&gt;–Σ₁ᵇ pᵢ·log₂(pᵢ)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Normalizes by &lt;code&gt;log₂(HIST_BINS)&lt;/code&gt; to obtain [0,1].&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Weiszfeld, E. (1937). &lt;em&gt;Sur le point pour lequel la somme des distances de n points donnés est minimum.&lt;/em&gt;   ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;Pearson, K. (1901). &lt;em&gt;On lines and planes of closest fit to systems of points in space.&lt;/em&gt;   ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;Hotelling, H. (1933). &lt;em&gt;Analysis of a complex of statistical variables into principal components.&lt;/em&gt;   ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;Mahalanobis, P.C. (1936). &lt;em&gt;On the generalized distance in statistics.&lt;/em&gt;   ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn5"&gt;
&lt;p&gt;Huber, P.J. (1981). &lt;em&gt;Robust Statistics.&lt;/em&gt;   ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn6"&gt;
&lt;p&gt;Shannon, C.E. (1948). &lt;em&gt;A Mathematical Theory of Communication.&lt;/em&gt;   ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>java</category>
      <category>biometrics</category>
      <category>security</category>
      <category>fingerprint</category>
    </item>
    <item>
      <title>Biometric fingerprint authentication on SmartCard Chips</title>
      <dc:creator>Julio Chinchilla</dc:creator>
      <pubDate>Tue, 16 Sep 2025 04:09:23 +0000</pubDate>
      <link>https://forem.com/juliofcv/biometric-fingerprint-authentication-on-smartcard-chips-5hcm</link>
      <guid>https://forem.com/juliofcv/biometric-fingerprint-authentication-on-smartcard-chips-5hcm</guid>
      <description>&lt;h1&gt;
  
  
  SEP7US MatchOnCard Auxiliary
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgai0nyhu0w73hyk2ghtr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgai0nyhu0w73hyk2ghtr.png" alt="SEP7US" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the years 2013 to 2018, in my early programming journey, I worked on projects related to smart cards based on ISO/IEC 7816-4 smart card chips. Below, I present &lt;strong&gt;SEP7US&lt;/strong&gt;, a library I implemented that was used for biometric match-on-card verification, following NIST’s MINEX guidelines.&lt;/p&gt;




&lt;h2&gt;
  
  
  Author
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/juliofcv" rel="noopener noreferrer"&gt;&lt;strong&gt;Julio Chinchilla&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project Repository
&lt;/h2&gt;

&lt;p&gt;You can find the full project here: &lt;a href="https://github.com/juliofcv/SEP7US" rel="noopener noreferrer"&gt;GitHub - SEP7US&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I consider it very important to briefly explain how this library works, since there is very little public documentation available about biometric standards.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Disclaimer
&lt;/h2&gt;

&lt;p&gt;SEP7US Match on Card 0x7E3&lt;/p&gt;

&lt;p&gt;Any modification made without proper supervision or consent is at your own risk. Changing the code will drastically alter verification results on any PIV Smart Card application.&lt;/p&gt;




&lt;h2&gt;
  
  
  Languages and Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;li&gt;Java Native Interface (JNI)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Purpose
&lt;/h2&gt;

&lt;p&gt;SEP7US provides an auxiliary library for converting biometric minutiae templates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ISO/IEC 19794-2:2005&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ANSI INCITS 378-2004&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;into the &lt;strong&gt;ISOCC format&lt;/strong&gt; required for biometric match-on-card verification of chips based on ISO/IEC 7816-4 standards.&lt;/p&gt;




&lt;h2&gt;
  
  
  Internal Process
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Minutiae Counting
&lt;/li&gt;
&lt;li&gt;Spatial Requantization
&lt;/li&gt;
&lt;li&gt;Angular Requantization
&lt;/li&gt;
&lt;li&gt;Minutiae Sorting
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Template Identification
&lt;/h2&gt;

&lt;p&gt;It is important to define the starting position of minutiae data depending on the template type:&lt;/p&gt;

&lt;h3&gt;
  
  
  ISO/IEC 19794-2:2005
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;posDataTemplate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// DEC=18&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ANSI INCITS 378-2004
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;posDataTemplate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// DEC=20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Minutiae Counting
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;numMinutiae&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;fTemplate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;posDataTemplate&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The array size for the ISOCC template will be determined by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// numMinutiae&lt;/span&gt;
&lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;sizeISOCC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numMinutiae&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// (X, Y, T|A)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Spatial Requantization
&lt;/h2&gt;

&lt;p&gt;This process expresses minutiae coordinates in terms of &lt;strong&gt;0.1mm&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Base Formula:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;CoordMM&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Coord&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;RES&lt;/span&gt;
&lt;span class="n"&gt;CoordUNITS&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CoordMM&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="n"&gt;CoordCC&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;CoordUNITS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Template Resolution Calculation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;xres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fTemplate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;posDataTemplate&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;fTemplate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;posDataTemplate&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;yres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fTemplate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;posDataTemplate&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;fTemplate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;posDataTemplate&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;X Coordinate:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcoordmmX&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptmpx&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;xres&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcoordunitsX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcoordmmX&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcoordccX&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcoordunitsX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Y Coordinate:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcoordmmY&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptmpy&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;yres&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcoordunitsY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcoordmmY&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcoordccY&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcoordunitsY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Angular Requantization
&lt;/h2&gt;

&lt;p&gt;The angular requantization represents minutiae angles in &lt;strong&gt;6 bits&lt;/strong&gt; (0–63), considering that the maximum value is 360°.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ISOCC angle resolution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;360/64 = 5.625°
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;ISOCC_ANGLE_RESOLUTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;5.625&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For ISO/IEC 19794-2:2005:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;360/256 = 1.40625°
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;ANGLE_RESOLUTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.40625&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For ANSI INCITS 378-2004:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;360/180 = 2°
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;ANGLE_RESOLUTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Final Computation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;tmpCAngle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ANGLE_RESOLUTION&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptmpa&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;tmpFAngle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tmpCAngle&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;ISOCC_ANGLE_RESOLUTION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptmpt&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;tmpFAngle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Minutiae Sorting
&lt;/h2&gt;

&lt;p&gt;Although some smart cards do not require sorting, SEP7US provides four main sorting functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;XYAsc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// X ascending&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;XYDsc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// X descending&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;YXAsc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Y ascending&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;YXDsc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Y descending&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  External Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ISOCC
&lt;/h3&gt;

&lt;p&gt;Generates an ISO Compact Card template.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kr"&gt;__declspec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dllexport&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;ISOCC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;templateFormat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fTemplate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;sorting&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;templateFormat&lt;/code&gt;: &lt;code&gt;0xFF&lt;/code&gt; for ISO/IEC 19794-2:2005, &lt;code&gt;0x7F&lt;/code&gt; for ANSI INCITS 378-2004
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fTemplate&lt;/code&gt;: Pointer to the original template
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sorting&lt;/code&gt;: Sorting option (&lt;code&gt;0x00&lt;/code&gt;, &lt;code&gt;0x0F&lt;/code&gt;, &lt;code&gt;0x10&lt;/code&gt;, &lt;code&gt;0x1F&lt;/code&gt;)
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Verify
&lt;/h3&gt;

&lt;p&gt;Generates an ISOCC template &lt;strong&gt;with ISO/IEC 7816-4 APDU headers&lt;/strong&gt; for PIV verification.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kr"&gt;__declspec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dllexport&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;Verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;CLA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;INS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;P1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;P2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;templateFormat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fTemplate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;sorting&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default APDU Command: &lt;code&gt;0x00 0x21&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Headers added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;7F2E : "Biometric Data Template"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;MIT&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>programming</category>
      <category>security</category>
      <category>biometric</category>
    </item>
  </channel>
</rss>
