1

私はバイオメトリック指紋スキャン デバイスを使用しており、指紋画像データを取得するための Java アプリケーションを既に開発しています。次に、その画像を処理して指紋照合を行います。そのために、1 つのオープン ソース ライブラリlibfprintを見つけました。

このライブラリは、画像を処理するための関数と、それらの画像を照合するための関数を提供します。アプリケーションは Java で作成されているため、イメージは Java コードからJNIを介して C コードに渡されます。たとえば、ライブラリ内の画像の 2 値化の関数は次のようになります。

struct fp_img *fp_img_binarize(struct fp_img *img)

構造データをパラメーターとして受け取る C コードの関数に、Java コードから何を渡す必要がありますか? または、パラメータとして構造体を受け取る場合、Java コードから C 関数に値を渡すにはどうすればよいでしょうか? または、この場合、JNI レイヤーをどのように記述すればよいでしょうか?

4

1 に答える 1

2

Java から画像を取得し、それを libfprint の fp_img 構造に変換する JNI 関数を作成する必要があります (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 に答える