diff --git a/THANKS b/THANKS index 76c0817..68143f9 100644 --- a/THANKS +++ b/THANKS @@ -6,3 +6,4 @@ Craig Watson (NIST) James Vasile (SFLC) Toby Howard (University of Manchester) Seemant Kulleen +Vasily Khoruzhick diff --git a/libfprint/drivers/aes2501.c b/libfprint/drivers/aes2501.c index 3334df7..3d95ea5 100644 --- a/libfprint/drivers/aes2501.c +++ b/libfprint/drivers/aes2501.c @@ -378,11 +378,11 @@ static int sum_histogram_values(unsigned char *data, uint8_t threshold) /* find overlapping parts of frames */ static unsigned int find_overlap(unsigned char *first_frame, - unsigned char *second_frame) + unsigned char *second_frame, unsigned int *min_error) { unsigned int dy; - unsigned int min_error = 255 * FRAME_SIZE; unsigned int not_overlapped_height = 0; + *min_error = 255 * FRAME_SIZE; for (dy = 0; dy < FRAME_HEIGHT; dy++) { /* Calculating difference (error) between parts of frames */ unsigned int i; @@ -397,8 +397,8 @@ static unsigned int find_overlap(unsigned char *first_frame, /* Normalize error */ error *= 15; error /= i; - if (error < min_error) { - min_error = error; + if (error < *min_error) { + *min_error = error; not_overlapped_height = dy; } first_frame += FRAME_WIDTH; @@ -409,11 +409,13 @@ static unsigned int find_overlap(unsigned char *first_frame, /* assemble a series of frames into a single image */ static unsigned int assemble(unsigned char *input, unsigned char *output, - int num_strips) + int num_strips, gboolean reverse, unsigned int *errors_sum) { uint8_t *assembled = output; int frame; uint32_t image_height = FRAME_HEIGHT; + unsigned int min_error; + *errors_sum = 0; if (num_strips < 1) return 0; @@ -422,6 +424,8 @@ static unsigned int assemble(unsigned char *input, unsigned char *output, * Taken from document describing aes2501 image format * TODO: move reversing detection here */ + if (reverse) + output += (num_strips - 1) * FRAME_SIZE; for (frame = 0; frame < num_strips; frame++) { int column; for (column = 0; column < FRAME_WIDTH; column++) { @@ -433,7 +437,10 @@ static unsigned int assemble(unsigned char *input, unsigned char *output, } } - output += FRAME_SIZE; + if (reverse) + output -= FRAME_SIZE; + else + output += FRAME_SIZE; } /* Detecting where frames overlaped */ @@ -442,11 +449,12 @@ static unsigned int assemble(unsigned char *input, unsigned char *output, int not_overlapped; output += FRAME_SIZE; - not_overlapped = find_overlap(assembled, output); + not_overlapped = find_overlap(assembled, output, &min_error); + *errors_sum += min_error; image_height += not_overlapped; assembled += FRAME_WIDTH * not_overlapped; memcpy(assembled, output, FRAME_SIZE); - } + } return image_height; } @@ -512,6 +520,7 @@ static int capture(struct fp_img_dev *dev, gboolean unconditional, int r; struct fp_img *img; unsigned int nstrips; + unsigned int errors_sum, r_errors_sum; unsigned char *cooked; unsigned char *imgptr; unsigned char buf[1705]; @@ -574,12 +583,19 @@ static int capture(struct fp_img_dev *dev, gboolean unconditional, if (nstrips == MAX_FRAMES) fp_warn("swiping finger too slow?"); - img->height = assemble(img->data, cooked, nstrips); + img->flags = FP_IMG_COLORS_INVERTED; + img->height = assemble(img->data, cooked, nstrips, FALSE, &errors_sum); + img->height = assemble(img->data, cooked, nstrips, TRUE, &r_errors_sum); + + if (r_errors_sum > errors_sum) { + img->height = assemble(img->data, cooked, nstrips, FALSE, &errors_sum); + img->flags |= FP_IMG_V_FLIPPED | FP_IMG_H_FLIPPED; + } + for (i = 0; i < img->height * FRAME_WIDTH; i++) img->data[i] = (cooked[i] << 4) | 0xf; img = fpi_img_resize(img, img->height * FRAME_WIDTH); - img->flags = FP_IMG_V_FLIPPED | FP_IMG_H_FLIPPED | FP_IMG_COLORS_INVERTED; *ret = img; return 0; err: