Could you try attached patch?

On Thu, Dec 22, 2016 at 10:24 AM, Carson Reinke <car...@reinke.co> wrote:
> Thanks Vasily and all your work on this.
>
> I actually had the raw image dumped in fpi_assemble_lines instead and there
> is no more distortion.  I tried to debug the exact issue but the code kind
> of makes my head spin.  I think maybe not all images should be processed
> through this function, instead only "fast swipe" images that are shorter
> than a certain tolerance should be.  Just a thought.  If I come up with
> something, I'll send it over.
>
> On Fri, Dec 16, 2016 at 7:12 PM, Vasily Khoruzhick <anars...@gmail.com>
> wrote:
>>
>> Hi Carson,
>>
>> All related code is in libfprint/assembling.c, you're probably
>> interested in fpi_assemble_lines().
>>
>> Regards,
>> Vasily
>>
>> On Fri, Dec 16, 2016 at 1:17 PM, Carson Reinke <car...@reinke.co> wrote:
>> > I seem to be having the same issue as reported by other awhile ago here:
>> > https://github.com/ars3niy/fprint_vfs5011/issues/9.  The head from
>> > master
>> > seems to work better, but still quite a bit of distortion.
>> >
>> > I believe this from trying to normalize the image from fast swipes.  Can
>> > anyone point me in a direction on where this is done?
>> >
>> > _______________________________________________
>> > fprint mailing list
>> > fprint@lists.freedesktop.org
>> > https://lists.freedesktop.org/mailman/listinfo/fprint
>> >
>
>
From 0bb137cd68b1d17f8cb9c8cb66a5b41f097c6c99 Mon Sep 17 00:00:00 2001
From: Vasily Khoruzhick <anars...@gmail.com>
Date: Tue, 27 Dec 2016 19:04:32 -0800
Subject: [PATCH] lib: do horizontal search for line assembly

---
 libfprint/assembling.c            | 54 ++++++++++++++++++++++-----------------
 libfprint/assembling.h            |  2 +-
 libfprint/drivers/upeksonly.c     |  4 +--
 libfprint/drivers/vfs0050.c       |  2 +-
 libfprint/drivers/vfs5011.c       | 28 ++++++++++++++------
 libfprint/drivers/vfs5011_proto.h |  1 +
 6 files changed, 56 insertions(+), 35 deletions(-)

diff --git a/libfprint/assembling.c b/libfprint/assembling.c
index 1052f99..c44fea6 100644
--- a/libfprint/assembling.c
+++ b/libfprint/assembling.c
@@ -354,6 +354,7 @@ struct fp_img *fpi_assemble_lines(struct fpi_line_asmbl_ctx *ctx,
 	float y = 0.0;
 	int line_ind = 0;
 	int *offsets = (int *)g_malloc0((lines_len / 2) * sizeof(int));
+	int *dxes = (int *)g_malloc0((lines_len / 2) * sizeof(int));
 	unsigned char *output = g_malloc0(ctx->line_width * ctx->max_height);
 	struct fp_img *img;
 
@@ -363,24 +364,29 @@ struct fp_img *fpi_assemble_lines(struct fpi_line_asmbl_ctx *ctx,
 	for (i = 0; (i < lines_len - 1) && row1; i += 2) {
 		int bestmatch = i;
 		int bestdiff = 0;
-		int j, firstrow, lastrow;
+		int bestdx = 0;
+		int j, firstrow, lastrow, dx;
 
 		firstrow = i + 1;
 		lastrow = min(i + ctx->max_search_offset, lines_len - 1);
 
 		row2 = g_slist_next(row1);
 		for (j = firstrow; j <= lastrow; j++) {
-			int diff = ctx->get_deviation(ctx,
-					row1,
-					row2);
-			if ((j == firstrow) || (diff < bestdiff)) {
-				bestdiff = diff;
-				bestmatch = j;
+			for (dx = -7; dx < 8; dx++) {
+				int diff = ctx->get_deviation(ctx,
+						row1,
+						row2, dx);
+				if ((j == firstrow) || (diff < bestdiff)) {
+					bestdiff = diff;
+					bestmatch = j;
+					bestdx = dx;
+				}
 			}
 			row2 = g_slist_next(row2);
 		}
 		offsets[i / 2] = bestmatch - i;
-		fp_dbg("%d", offsets[i / 2]);
+		dxes[i / 2] = bestdx;
+		fp_dbg("offset: %d, dx: %d", offsets[i / 2], dxes[i / 2]);
 		row1 = g_slist_next(row1);
 		if (row1)
 			row1 = g_slist_next(row1);
@@ -394,22 +400,23 @@ struct fp_img *fpi_assemble_lines(struct fpi_line_asmbl_ctx *ctx,
 	row1 = lines;
 	for (i = 0; i < lines_len - 1; i++, row1 = g_slist_next(row1)) {
 		int offset = offsets[i/2];
-		if (offset > 0) {
-			float ynext = y + (float)ctx->resolution / offset;
-			while (line_ind < ynext) {
-				if (line_ind > ctx->max_height - 1)
-					goto out;
-				interpolate_lines(ctx,
-					row1, y,
-					g_slist_next(row1),
-					ynext,
-					output + line_ind * ctx->line_width,
-					line_ind,
-					ctx->line_width);
-				line_ind++;
-			}
-			y = ynext;
+		float dy = (float)ctx->resolution / offset;
+		float ynext;
+		fp_dbg("dy: %f", (double)dy);
+		ynext = y + dy;
+		while (line_ind < ynext) {
+			if (line_ind > ctx->max_height - 1)
+				goto out;
+			interpolate_lines(ctx,
+				row1, y,
+				g_slist_next(row1),
+				ynext,
+				output + line_ind * ctx->line_width,
+				line_ind,
+				ctx->line_width);
+			line_ind++;
 		}
+		y = ynext;
 	}
 out:
 	img = fpi_img_new(ctx->line_width * line_ind);
@@ -417,6 +424,7 @@ out:
 	img->width = ctx->line_width;
 	img->flags = FP_IMG_V_FLIPPED;
 	g_memmove(img->data, output, ctx->line_width * line_ind);
+	g_free(dxes);
 	g_free(offsets);
 	g_free(output);
 	return img;
diff --git a/libfprint/assembling.h b/libfprint/assembling.h
index 3bcab2f..072c3c7 100644
--- a/libfprint/assembling.h
+++ b/libfprint/assembling.h
@@ -53,7 +53,7 @@ struct fpi_line_asmbl_ctx {
 	unsigned median_filter_size;
 	unsigned max_search_offset;
 	int (*get_deviation)(struct fpi_line_asmbl_ctx *ctx,
-			     GSList *line1, GSList *line2);
+			     GSList *line1, GSList *line2, int dx);
 	unsigned char (*get_pixel)(struct fpi_line_asmbl_ctx *ctx,
 				   GSList *line,
 				   unsigned x);
diff --git a/libfprint/drivers/upeksonly.c b/libfprint/drivers/upeksonly.c
index e4dce7c..6f07760 100644
--- a/libfprint/drivers/upeksonly.c
+++ b/libfprint/drivers/upeksonly.c
@@ -118,7 +118,7 @@ struct sonly_dev {
 
 /* Calculade squared standand deviation of sum of two lines */
 static int upeksonly_get_deviation2(struct fpi_line_asmbl_ctx *ctx,
-			  GSList *line1, GSList *line2)
+			  GSList *line1, GSList *line2, int dx)
 {
 	unsigned char *buf1 = line1->data, *buf2 = line2->data;
 	int res = 0, mean = 0, i;
@@ -162,7 +162,7 @@ static unsigned char upeksonly_get_pixel(struct fpi_line_asmbl_ctx *ctx,
 static struct fpi_line_asmbl_ctx assembling_ctx = {
 	.max_height = 1024,
 	.resolution = 8,
-	.median_filter_size = 25,
+	.median_filter_size = 13,
 	.max_search_offset = 30,
 	.get_deviation = upeksonly_get_deviation2,
 	.get_pixel = upeksonly_get_pixel,
diff --git a/libfprint/drivers/vfs0050.c b/libfprint/drivers/vfs0050.c
index 31d793c..b7bcf47 100644
--- a/libfprint/drivers/vfs0050.c
+++ b/libfprint/drivers/vfs0050.c
@@ -190,7 +190,7 @@ static unsigned char vfs0050_get_pixel(struct fpi_line_asmbl_ctx *ctx,
 
 /* Deviation getter for fpi_assemble_lines */
 static int vfs0050_get_difference(struct fpi_line_asmbl_ctx *ctx,
-				  GSList * line_list_1, GSList * line_list_2)
+				  GSList * line_list_1, GSList * line_list_2, int dx)
 {
 	struct vfs_line *line1 = line_list_1->data;
 	struct vfs_line *line2 = line_list_2->data;
diff --git a/libfprint/drivers/vfs5011.c b/libfprint/drivers/vfs5011.c
index 5aaccc1..4b39e82 100644
--- a/libfprint/drivers/vfs5011.c
+++ b/libfprint/drivers/vfs5011.c
@@ -253,13 +253,19 @@ static void usb_exchange_async(struct fpi_ssm *ssm,
 /* ====================== utils ======================= */
 
 /* Calculade squared standand deviation of sum of two lines */
-static int vfs5011_get_deviation2(struct fpi_line_asmbl_ctx *ctx, GSList *row1, GSList *row2)
+static int vfs5011_get_deviation2(struct fpi_line_asmbl_ctx *ctx,
+				  GSList *row1, GSList *row2, int dx)
 {
 	unsigned char *buf1, *buf2;
 	int res = 0, mean = 0, i;
-	const int size = 64;
+	const int size = VFS5011_SHORT_LINE_WIDTH;
 
-	buf1 = row1->data + 56;
+	if (dx > 7)
+		dx = 7;
+	if (dx < -7)
+		dx = -7;
+
+	buf1 = row1->data + 56 + dx;
 	buf2 = row2->data + 168;
 
 	for (i = 0; i < size; i++)
@@ -357,12 +363,13 @@ static int process_chunk(struct vfs5011_data *data, int transferred)
 	fp_dbg("process_chunk: got %d bytes", transferred);
 	int lines_captured = transferred/VFS5011_LINE_SIZE;
 	int i;
+	int sq_diff_norm = 0;
 
 	for (i = 0; i < lines_captured; i++) {
 		unsigned char *linebuf = data->capture_buffer
 					 + i * VFS5011_LINE_SIZE;
 
-		if (fpi_std_sq_dev(linebuf + 8, VFS5011_IMAGE_WIDTH)
+		if (fpi_std_sq_dev(linebuf + 168, VFS5011_SHORT_LINE_WIDTH)
 				< DEVIATION_THRESHOLD) {
 			if (data->lines_captured == 0)
 				continue;
@@ -383,11 +390,16 @@ static int process_chunk(struct vfs5011_data *data, int transferred)
 			return 1;
 		}
 
+		if (data->lastline != NULL) {
+			sq_diff_norm = fpi_mean_sq_diff_norm(data->lastline + 8,
+						     linebuf + 8,
+						     VFS5011_IMAGE_WIDTH);
+			sq_diff_norm += fpi_mean_sq_diff_norm(data->lastline + 168,
+							      linebuf + 168,
+							      VFS5011_SHORT_LINE_WIDTH);
+		}
 		if ((data->lastline == NULL)
-			|| (fpi_mean_sq_diff_norm(
-				data->lastline + 8,
-				linebuf + 8,
-				VFS5011_IMAGE_WIDTH) >= DIFFERENCE_THRESHOLD)) {
+			|| sq_diff_norm >= DIFFERENCE_THRESHOLD) {
 			data->lastline = g_malloc(VFS5011_LINE_SIZE);
 			data->rows = g_slist_prepend(data->rows, data->lastline);
 			g_memmove(data->lastline, linebuf, VFS5011_LINE_SIZE);
diff --git a/libfprint/drivers/vfs5011_proto.h b/libfprint/drivers/vfs5011_proto.h
index 8cd0ea8..d162d47 100644
--- a/libfprint/drivers/vfs5011_proto.h
+++ b/libfprint/drivers/vfs5011_proto.h
@@ -3,6 +3,7 @@
 
 #define VFS5011_LINE_SIZE 240
 #define VFS5011_IMAGE_WIDTH 160
+#define VFS5011_SHORT_LINE_WIDTH 64
 
 enum {
 	VFS5011_DEFAULT_WAIT_TIMEOUT = 3000,
-- 
2.11.0

_______________________________________________
fprint mailing list
fprint@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/fprint

Reply via email to