我正在使用生物识别指纹扫描设备,我已经开发了一个 Java 应用程序来获取指纹图像数据。现在我想处理该图像并进行指纹匹配。为此,我找到了一个开源库,libfprint .
这个库提供了一些处理图像的函数,也提供了匹配这些图像的函数。由于该应用程序是用 Java 编写的,因此图像从 Java 代码通过 JNI 传递。到C代码。现以库中图像二值化函数为例
struct fp_img *fp_img_binarize(struct fp_img *img)
我应该将什么从 Java 代码传递给 C 代码中以结构数据作为参数的函数?或者,如果它们将结构作为参数,我如何将值从 Java 代码传递给 C 函数?或者在这种情况下如何编写 JNI 层?
最佳答案
您必须编写一个 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 header 中声明,因此您必须自己声明或重新实现它。它只是这样做:
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。然后,您可以在 JNI 函数中将 Java 图像的像素简单地写入此数组。 当您最终获得图像时,您可以将其传递给 fp_img_binarize 函数。
关于java - 如何使用 JNI 将图像作为结构参数传递给 libfprint 的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103150/