1

我正在使用生物指纹扫描设备,并且我已经开发了一个 Java 应用程序来获取指纹图像数据。现在我想处理该图像并进行指纹匹配。为此,我找到了一个开源库libfprint

该库提供了一些处理图像的函数以及匹配这些图像的函数。由于应用程序是用 Java 编写的,因此图像通过JNI从 Java 代码传递到 C 代码。现在例如库中的图像二值化功能如下所示

struct fp_img *fp_img_binarize(struct fp_img *img)

在将结构数据作为参数的 C 代码中,我应该将什么从 Java 代码传递给此类函数?或者,如果它们将结构作为参数,我如何将 Java 代码中的值传递给 C 函数?或者在这种情况下如何编写 JNI 层?

4

1 回答 1

2

您必须编写一个 JNI 函数,该函数将从 Java 中获取图像并将其转换为 libfprint 的 fp_img 结构(您不能只从 Java 中调用任何 C 库函数)。

libfprint 中的结构如下所示

struct fp_img {
    int width;
    int height;
    size_t length;
    uint16_t flags;
    struct fp_minutiae *minutiae;
    unsigned char *binarized;
    unsigned char data[0];
};

libfprint 并不是真的要与外部图像一起使用。通常应该首先使用 libfprint 获取指纹图像。

但是您可以通过调用该函数来创建一个新图像

struct fp_img *fpi_img_new(size_t length)

长度=宽度*高度。问题是,这个函数可能没有在 libfprint 头文件中声明,所以你必须自己声明它或重新实现它。它只是这样做:

struct fp_img *img = malloc(sizeof(struct fp_img) + length);
img->length = length;

然后您可能还应该设置

img->width = width;
img->height = height;

然后,您可以使用此函数访问原始图像数据(8 位灰度)(我假设行列顺序,即 data[x + y*img->width] 将是 (x,y) 像素)。

unsigned char *fp_img_get_data(struct fp_img *img)

您可以将此数组视为 size=length。然后,您可以简单地将 Java 图像的像素写入 JNI 函数中的此数组中。当你最终得到你的图像时,你可以将它传递给 fp_img_binarize 函数。

于 2013-08-08T08:01:47.027 回答