Page tree

Полный список примеров, который есть в комплекте SDK (/fapi/samples): 

Вспомогательный файл

Файл Common.h
#pragma once

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

#include <fapi.h>

#define STB_IMAGE_IMPLEMENTATION

#include <stb_image.h>

void print_buffer(const uint8_t* buffer, size_t size) {

    printf("\n");
    for (size_t i = 0; i < size; i++)
        printf("%02X ", buffer[i]);

    printf("\n");
}

Формирование шаблона отпечатка пальца по ГОСТ 19794-2-2013 из изображения отпечатка

Файл Enroll.c
#include <Common.h>

int main() {
    unsigned long returnCode; // Код возврата функций FAPI
    size_t bufferSize;        // Размер массива с шаблоном отпечатка в байтах
    uint8_t* buffer;          // Буфер для шаблона
    uint8_t* image = NULL;    // Буфер для изображения отпечатка
    int width;                // Ширина изображения отпечатка
    int height;               // Длина изображения отпечатка
    int channels;             // Количество каналов в изображении отпечатка

    // Чтение изображения отпечатка из файла
    image = stbi_load("image1.bmp", &width, &height, &channels, 1);

    if (!image) {
        printf("Failed to load image\n");
        goto exit;
    }

    // Инициализация библиотеки FAPI
    returnCode = PS_InitFAPI();

    if (returnCode != FAPIT_SUCCESS) {
        printf("PS_InitFAPI failed\n");
        goto free_image;
    }

    // Вызов PS_Enroll без передачи указателя на буфер для определения размера буфера
    returnCode = PS_Enroll(image, width, height, NULL, &bufferSize);

    if (returnCode != FAPIT_SUCCESS) {
        printf("PS_Enroll failed\n");
        goto free_image;
    }

    // Выделение памяти под шаблон
    buffer = malloc(bufferSize * sizeof(uint8_t));

    // Вызов PS_Enroll для получения байт шаблона
    returnCode = PS_Enroll(image, width, height, buffer, &bufferSize);

    if (returnCode != FAPIT_SUCCESS) {
        printf("PS_Enroll failed\n");
        free(buffer);
        goto free_image;
    }

    // Выводим содержимое буфера
    print_buffer(buffer, bufferSize);
    // Освобождаем память, выделенную через malloc
    free(buffer);

free_image:
    stbi_image_free(image);

exit:
    // Деинициализация библиотеки FAPI
    returnCode = PS_UninitFAPI();

    if (returnCode != FAPIT_SUCCESS) {
        printf("PS_IninitFAPI failed\n");
    }
   
    return returnCode;
}

Cоздание комплексного шаблона и добавление отпечатка в созданный шаблон

Файл EnrollUpdate.c
#include <Common.h>

int main() {
    unsigned long returnCode; // Код возврата функций FAPI
    size_t bufferSize;        // Размер массива с шаблоном отпечатка в байтах
    uint8_t* buffer;          // Буфер для шаблона
    FAPI_HANDLE fapiHandle;   // Дескриптор комплексного шаблона FAPI
    uint8_t* images[4];       // Буферы для изображений отпечатков
    int widths[4];            // Ширины изображений отпечатков
    int heights[4];           // Длины изображений отпечатков
    int channels;             // Количество каналов в изображении отпечатка

    // Имена файлов с изображениями отпечатков
    const char* fileNames[4] = {
        "image1.bmp",
        "image2.bmp",
        "image3.bmp",
        "image4.bmp",
    };

    // Чтение изображений отпечатков из файлов
    for (int i = 0; i < 4; ++i) {
        images[i] = stbi_load(fileNames[i], &widths[i], &heights[i], &channels, 1);

        if (!images[i]) {
            for (int j = 0; j < i; ++j)
                stbi_image_free(images[j]);
            printf("Failed to read images\n");
            goto exit;
        }
    }

    // Инициализация библиотеки FAPI
    returnCode = PS_InitFAPI();

    if (returnCode != FAPIT_SUCCESS) {
        printf("PS_InitFAPI failed\n");
        goto free_images;
    }

    // Вызов функции PS_EnrollInit, инициализация создания комплексного шаблона
    returnCode = PS_EnrollInit(&fapiHandle,
fapi_finger_right_index, FAPI_RECOMMENDED_REGISTRATION_FINGERPRINTS_COUNT);

    if (returnCode != FAPIT_SUCCESS) {
        printf("PS_EnrollInit failed\n");
        goto free_images;
    }

    for (size_t i = 0; i < 4; i++) {
        // Вызов функции PS_EnrollUpdate, добавление отпечатка в шаблон
        returnCode = PS_EnrollUpdate(fapiHandle, images[i], widths[i], heights[i]);

        if (returnCode != FAPIT_SUCCESS) {
            printf("PS_EnrollUpdate failed\n");
            goto free_images;
        }
    }

    // Вызов функции PS_EnrollFinal, получение размера буфера для шаблона
    returnCode = PS_EnrollFinal(fapiHandle, NULL, &bufferSize);

    if (returnCode != FAPIT_SUCCESS) {
        printf("PS_EnrollFinal failed\n");
        goto free_images;
    }

    // Выделение памяти под шаблон
    buffer = malloc(bufferSize * sizeof(uint8_t));

    // Вызов PS_EnrollFinal для получения байт шаблона
    returnCode = PS_EnrollFinal(fapiHandle, buffer, &bufferSize);

    if (returnCode != FAPIT_SUCCESS) {
        printf("PS_EnrollFinal failed\n");
        free(buffer);
        goto free_images;
    }

  // Вывод содержимого буфера
    print_buffer(buffer, bufferSize);
  // Освобождение памяти, выделенной через malloc
    free(buffer);

free_images:
    for (int i = 0; i < 4; ++i)
        stbi_image_free(images[i]);

exit:
    // Деинициализация библиотеки FAPI
    returnCode = PS_UninitFAPI();

    if (returnCode != FAPIT_SUCCESS) {
        printf("PS_IninitFAPI failed\n");
    }

    return returnCode;
}
  • No labels