Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Image to template test #32

Open
wants to merge 18 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion Sources/Extraction/Extract.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@
#include "Extraction/Filters/OrientedSmoother.h"
#include "Extraction/Filters/ThresholdBinarizer.h"
#include "Extraction/Filters/Thinner.h"
#include "Templates/Template.h"

const int blockSize = 16;

void Extract(UInt8Array2D *image, struct perfdata *perfdata, UInt8Array2D *outBinarized, UInt8Array2D *outThinned)
void Extract(UInt8Array2D *image, Template *template, struct perfdata *perfdata, UInt8Array2D *outBinarized, UInt8Array2D *outThinned)
{
if (perfdata) gettimeofday(&perfdata->start, 0);
Size size = Size_Construct(image->sizeX, image->sizeY);
Expand Down Expand Up @@ -71,9 +72,17 @@ void Extract(UInt8Array2D *image, struct perfdata *perfdata, UInt8Array2D *outBi

// Minutiae detection
if (perfdata) gettimeofday(&perfdata->start_detection, 0);
//TODO: wire-up minutiae detection.

// Minutiae filtering
if (perfdata) gettimeofday(&perfdata->start_filtering, 0);
//TODO: wire-up minutiae filtering.

// Generate Template
if (perfdata) gettimeofday(&perfdata->start_template, 0);
//TODO: Generate Template from minutiae.

if (perfdata) gettimeofday(&perfdata->end, 0);

// Cleanup
BlockMap_Destruct(&blocks);
Expand Down
6 changes: 4 additions & 2 deletions Sources/Extraction/Extract.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <sys/time.h>
#include "General/Array.h"
#include "General/BinaryMap.h"
#include "Templates/Template.h"

struct perfdata {
struct timeval start;
Expand All @@ -12,7 +13,8 @@ struct perfdata {
struct timeval start_thinning;
struct timeval start_detection;
struct timeval start_filtering;
struct timeval start_template;
struct timeval end;
};
} perfdata;

void Extract(UInt8Array2D *image, struct perfdata *perfdata, UInt8Array2D *binarized, UInt8Array2D *thinned);
void Extract(UInt8Array2D *image, Template *template, struct perfdata *perfdata, UInt8Array2D *binarized, UInt8Array2D *thinned);
2 changes: 1 addition & 1 deletion Sources/General/List.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#ifndef GENERAL_LIST_H
#define GENERAL_LIST_H

#include <stdbool.h>
#include <stdint.h>
#include <stdbool.h>

Expand Down
18 changes: 8 additions & 10 deletions Sources/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -45,23 +45,21 @@ UTEST_EXE = all_tests
## Source files to include and exclude
##
LIBAFIS_SRCS = General/*.c \
Extraction/Filters/*.c \
Extraction/Model/*.c \
Extraction/MinutiaeDetection/*.c \
Extraction/*.c \
Matcher/*.c \
Matcher/Minutia/*.c
Extraction/Filters/*.c Extraction/Model/*.c Extraction/MinutiaeDetection/*.c Extraction/*.c \
Templates/*.c \
Matcher/*.c Matcher/Minutia/*.c

LIBAFIS_SRCS_EXCLUDE =

UTILS_SRCS = IO/*.c
UTILS_SRCS_EXCLUDE =

UTEST_SRCS = General/*.c General/runners/*.c \
Extraction/Filters/*.c Extraction/Filters/runners/*.c \
Extraction/Model/*.c Extraction/Model/runners/*.c \
DataStructures/*.c Matcher/*.c Matcher/runners/*.c

Extraction/Filters/*.c Extraction/Filters/runners/*.c Extraction/Model/*.c Extraction/Model/runners/*.c \
DataStructures/*.c \
EndToEnd/*.c \
Matcher/*.c Matcher/runners/*.c

UTEST_SRCS_EXCLUDE =
UTEST_SRCS += $(UTEST_EXE).c

Expand Down
17 changes: 17 additions & 0 deletions Sources/Templates/Minutia.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef TEMPLATES_MINUTIA_H
#define TEMPLATES_MINUTIA_H

#include "General/Point.h"

#include <stdint.h>

typedef enum {ENDING = 0, BIFURCATION = 1, OTHER = 2} MinutiaType;

typedef struct TemplateMinutia
{
Point position;
uint8_t direction;
MinutiaType type;
} TemplateMinutia;

#endif
35 changes: 35 additions & 0 deletions Sources/Templates/Template.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include "Templates/Template.h"
#include "General/List.h"

#include <stdlib.h>
#include <assert.h>

void Template_AddMinuitia(Template *template, TemplateMinutia *minutia)
{
List_AddData(&(template->minutiae), minutia);
}

List *Template_GetMinutiae(Template *template)
{
return &template->minutiae;
}

Template Template_Constuct()
{
Template template;
template.originalDpi = 0;
template.originalWidth = 0;
template.originalHeight = 0;
template.minutiae = List_Construct();
return template;
}

void Template_Free(Template *template)
{
while (List_GetCount(&(template->minutiae)) > 0)
{
void *dataFound;
List_Remove(&(template->minutiae), (template->minutiae.tail), &dataFound);
free(dataFound);
}
}
20 changes: 20 additions & 0 deletions Sources/Templates/Template.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#ifndef TEMPLATES_TEMPLATE_H
#define TEMPLATES_TEMPLATE_H

#include "Templates/Minutia.h"
#include "General/List.h"
#include <stdint.h>

typedef struct Template
{
int32_t originalDpi;
int32_t originalWidth;
int32_t originalHeight;
List minutiae;
} Template;

Template Template_Constuct(void);
void Template_AddMinuitia(Template *, TemplateMinutia *);
void Template_Free(Template *);

#endif
7 changes: 7 additions & 0 deletions Sources/Tests/EndToEnd/TestRunner_EndToEnd.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "unity.h"
#include "unity_fixture.h"

TEST_GROUP_RUNNER(EndToEnd)
{
RUN_TEST_CASE(EndToEnd, ImageToTemplate);
}
152 changes: 152 additions & 0 deletions Sources/Tests/EndToEnd/Test_EndToEnd.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
#include "Extraction/Extract.h"
#include "General/pgm.h"
#include "Templates/Template.h"
#include "unity.h"
#include "unity_fixture.h"
#include <assert.h>
#include <string.h>

TEST_GROUP(EndToEnd);

static const char *inputFiles[] =
{
"../TestImages/Person1/Bas1440999265-Hamster-0-0.png.pgm",
"../TestImages/Person1/Bas1440999265-Hamster-0-1.png.pgm",
"../TestImages/Person1/Bas1440999265-Hamster-0-2.png.pgm",
"../TestImages/Person1/Bas1440999265-Hamster-1-0.png.pgm",
"../TestImages/Person1/Bas1440999265-Hamster-1-1.png.pgm",
"../TestImages/Person1/Bas1440999265-Hamster-1-2.png.pgm"
};

TEST_SETUP(EndToEnd)
{
}

TEST_TEAR_DOWN(EndToEnd)
{
}

static void ReadTemplate(const char *expectedFileName, Template *expectedTemplate)
{
FILE *f = fopen(expectedFileName, "rb");

int ret = fread(&expectedTemplate->originalDpi, sizeof(int32_t), 1, f);
TEST_ASSERT_TRUE_MESSAGE(ret == 1, "ReadTemplate: failed originalDPI");

ret = fread(&expectedTemplate->originalHeight, sizeof(int32_t), 1, f);
TEST_ASSERT_TRUE_MESSAGE(ret == 1, "ReadTemplate: failed originalHeight");

ret = fread(&expectedTemplate->originalWidth, sizeof(int32_t), 1, f);
TEST_ASSERT_TRUE_MESSAGE(ret == 1, "ReadTemplate: failed originalWidth");

int32_t count;
ret = fread(&count, sizeof(int32_t), 1, f);
TEST_ASSERT_TRUE_MESSAGE(ret == 1, "ReadTemplate: failed on minutiae count");

for(int i = 0; i < count; i++)
{
TemplateMinutia *minutia = calloc(1, sizeof(TemplateMinutia));

ret = fread(&(minutia->direction), sizeof(int8_t), 1, f);
TEST_ASSERT_TRUE_MESSAGE(ret == 1, "ReadTemplate: failed on minutia->direction");

ret = fread(&(minutia->position.x), sizeof(int32_t), 1, f);
TEST_ASSERT_TRUE_MESSAGE(ret == 1, "ReadTemplate: failed minutia->position.x");

ret = fread(&(minutia->position.y), sizeof(int32_t), 1, f);
TEST_ASSERT_TRUE_MESSAGE(ret == 1, "ReadTemplate: failed minutia->position.y");

ret = fread(&(minutia->type), sizeof(int32_t), 1, f);
TEST_ASSERT_TRUE_MESSAGE(ret == 1, "ReadTemplate: failed on minutia->type");

Template_AddMinuitia(expectedTemplate, minutia);
}

/* Check end of file */
uint8_t tmp;
ret = fread(&tmp, sizeof(uint8_t), 1, f);
TEST_ASSERT_TRUE_MESSAGE(ret == 0 && feof(f), "ReadTemplate: Bad end of file");

/* Close file */
ret = fclose(f);
assert(ret != EOF);
}


static void UnityFreeTemplate(Template *template)
{
while (List_GetCount(&template->minutiae) > 0)
{
void *dataFound;
List_Remove(&template->minutiae, template->minutiae.tail, &dataFound);
free(dataFound);
}
}

static void ImageToTemplate(const char *inputFileName, const char *expectedFileName)
{
UInt8Array2D image = pgm_read(inputFileName);

TEST_ASSERT_TRUE_MESSAGE(image.sizeX > 1, "Image Size X < 1");
TEST_ASSERT_TRUE_MESSAGE(image.sizeY > 1, "Image Size Y < 1");

struct perfdata perfdata;

Template template = Template_Constuct();
Template expectedTemplate = Template_Constuct();

printf("%s %s\r\n", inputFileName, expectedFileName);

Extract(&image, &template, &perfdata, NULL, NULL);

ReadTemplate(expectedFileName, &expectedTemplate);

printf("originalDpi %d %d\n", expectedTemplate.originalDpi, template.originalDpi);
printf("originalWidth %d %d\n", expectedTemplate.originalWidth, template.originalWidth);
printf("originalHeight %d %d\n", expectedTemplate.originalHeight, template.originalHeight);
printf("#minutiae %d %d\n", expectedTemplate.minutiae.count, template.minutiae.count);
List matching = List_Construct();
List missingFromExpected = List_Construct();
List missingFromTemplate= List_Construct();

for (ListElement *i = expectedTemplate.minutiae.head; i != NULL; i = i->next)
{
TemplateMinutia *expected = i->data;
bool found = false;
for (ListElement *j = template.minutiae.head; j != NULL; j = j->next)
{
TemplateMinutia *templateMin = i->data;
if ((templateMin->type == expected->type) && (templateMin->direction == expected->direction) && (templateMin->position.x == expected->position.x) && (templateMin->position.y == expected->position.y))
{
List_AddData(&matching, expected);
found = true;
}
}
if (!found)
{
List_AddData(&missingFromTemplate, expected);
}
}
if (expectedTemplate.minutiae.count > 0)
{
printf("Matching = %d%%\n", matching.count * 100 / expectedTemplate.minutiae.count);
printf("Missing from template = %d%%\n", missingFromTemplate.count * 100 / expectedTemplate.minutiae.count);
printf("Missing from expected = %d%%\n", missingFromExpected.count * 100 / expectedTemplate.minutiae.count);
}


UnityFreeTemplate(&template);
UnityFreeTemplate(&expectedTemplate);
}

TEST(EndToEnd, ImageToTemplate)
{
int length = sizeof(inputFiles) / sizeof(inputFiles[0]);
for(int i = 0; i < length; i++)
{
char templateFile[256];
strcpy(templateFile, inputFiles[i]);
strcat(templateFile, ".template");
ImageToTemplate(inputFiles[i], templateFile);
}
}
2 changes: 1 addition & 1 deletion Sources/Tests/Extraction/Filters/Test_VotingFilter.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ TEST(VotingFilter, VotingFilter_regression_tests_against_sourceAfis)

sprintf(inputFile, "%s.input.dat", regressionFiles[i]);

printf("File = %s\r\n", inputFile);
// printf("File = %s\r\n", inputFile);
sprintf(outputFile, "%s.result.dat", regressionFiles[i]);
sprintf(paramRadius, "%s.Radius.dat", regressionFiles[i]);
sprintf(paramMajority, "%s.Majority.dat", regressionFiles[i]);
Expand Down
Loading