static void capture_read_data_cb(struct libusb_transfer *transfer) { struct fpi_ssm *ssm = transfer->user_data; struct fp_img_dev *dev = ssm->priv; unsigned char *data = transfer->buffer; struct fp_img *img; if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { fp_dbg("request is not completed, %d", transfer->status); fpi_ssm_mark_aborted(ssm, -EIO); goto out; } else if (transfer->length != transfer->actual_length) { fp_dbg("expected %d, sent %d bytes", transfer->length, transfer->actual_length); fpi_ssm_mark_aborted(ssm, -EPROTO); goto out; } img = fpi_img_new(IMAGE_SIZE); memcpy(img->data, data, IMAGE_SIZE); fpi_imgdev_image_captured(dev, img); fpi_imgdev_report_finger_status(dev, FALSE); fpi_ssm_mark_completed(ssm); out: g_free(transfer->buffer); libusb_free_transfer(transfer); }
/** \ingroup img * Get a binarized form of a standardized scanned image. This is where the * fingerprint image has been "enhanced" and is a set of pure black ridges * on a pure white background. Internally, image processing happens on top * of the binarized image. * * The image must have been \ref img_std "standardized" otherwise this function * will fail. * * It is safe to binarize an image and free the original while continuing * to use the binarized version. * * You cannot binarize an image twice. * * \param img a standardized image * \returns a new image representing the binarized form of the original, or * NULL on error. Must be freed with fp_img_free() after use. */ API_EXPORTED struct fp_img *fp_img_binarize(struct fp_img *img) { struct fp_img *ret; int height = img->height; int width = img->width; int imgsize = height * width; if (img->flags & FP_IMG_BINARIZED_FORM) { fp_err("image already binarized"); return NULL; } if (!img->binarized) { int r = fpi_img_detect_minutiae(img); if (r < 0) return NULL; if (!img->binarized) { fp_err("no minutiae after successful detection?"); return NULL; } } ret = fpi_img_new(imgsize); ret->flags |= FP_IMG_BINARIZED_FORM; ret->width = width; ret->height = height; memcpy(ret->data, img->binarized, imgsize); return ret; }
static int submit_image(struct fpi_ssm *ssm) { struct fp_img_dev *dev = ssm->priv; vfs301_dev_t *vdev = dev->priv; int height; struct fp_img *img; #if 0 /* XXX: This is probably handled by libfprint automagically? */ if (vdev->scanline_count < 20) { fpi_ssm_jump_to_state(ssm, M_REQUEST_PRINT); return 0; } #endif img = fpi_img_new(VFS301_FP_OUTPUT_WIDTH * vdev->scanline_count); if (img == NULL) return 0; vfs301_extract_image(vdev, img->data, &height); /* TODO: how to detect flip? should the resulting image be * oriented so that it is equal e.g. to a fingerprint on a paper, * or to the finger when I look at it?) */ img->flags = FP_IMG_COLORS_INVERTED | FP_IMG_V_FLIPPED; img->width = VFS301_FP_OUTPUT_WIDTH; img->height = height; img = fpi_img_resize(img, img->height * img->width); fpi_imgdev_image_captured(dev, img); return 1; }
void et_assemble_image(struct fpi_img_dev* dev) { //size_t sz=(61440/4)*8; //size_t sz=(61440*8)+6144; size_t sz=(192*160); //size_t sz=(61440/2)*8; //size_t sz=320*384; struct fp_img* img; int pos=0; char* p; img=fpi_img_new(sz); //img->flags=FP_IMG_COLORS_INVERTED; img->flags=FP_IMG_STANDARDIZATION_FLAGS; for(int i=0;i<8;i++) { for(int x=0;x<20;x++) { p=et_get_row(et_img_buf[i],x); for(int y=0;y<768;y+=4,pos++) { img->data[pos]=p[y]; } } /*if(i) { memcpy(&img->data[pos],et_img_buf[i],61440); pos+=61440; } else { memcpy(&img->data[pos],et_img_buf[i],6144); pos+=6144; }*/ /*for(int x=0;x<61440;x+=4,pos++) { img->data[pos]=et_img_buf[i][x]; } */ /*for(int x=0;x<61440;x+=2,pos++) { img->data[pos]=et_img_buf[i][x]; }*/ /*for(int x=0;x<61440;x+=2,pos++) { if(x && !(x%384)) { x+=384; //continue; } img->data[pos]=et_img_buf[i][x]; }*/ } fpi_imgdev_image_captured(dev,img); free_img_buf(); }
struct fp_img *fpi_img_new_for_imgdev(struct fp_img_dev *imgdev) { struct fp_img_driver *imgdrv = fpi_driver_to_img_driver(imgdev->dev->drv); int width = imgdrv->img_width; int height = imgdrv->img_height; struct fp_img *img = fpi_img_new(width * height); img->width = width; img->height = height; return img; }
struct fp_img *fpi_im_resize(struct fp_img *img, unsigned int factor) { Image *mimg; Image *resized; ExceptionInfo exception; MagickBooleanType ret; int new_width = img->width * factor; int new_height = img->height * factor; struct fp_img *newimg; /* It is possible to implement resizing using a simple algorithm, however * we use ImageMagick because it applies some kind of smoothing to the * result, which improves matching performances in my experiments. */ if (!IsMagickInstantiated()) InitializeMagick(NULL); GetExceptionInfo(&exception); mimg = ConstituteImage(img->width, img->height, "I", CharPixel, img->data, &exception); GetExceptionInfo(&exception); resized = ResizeImage(mimg, new_width, new_height, 0, 1.0, &exception); newimg = fpi_img_new(new_width * new_height); newimg->width = new_width; newimg->height = new_height; newimg->flags = img->flags; GetExceptionInfo(&exception); ret = ExportImagePixels(resized, 0, 0, new_width, new_height, "I", CharPixel, newimg->data, &exception); if (ret != MagickTrue) { fp_err("export failed"); return NULL; } DestroyImage(mimg); DestroyImage(resized); return newimg; }
static int submit_image(struct fp_img_dev *dev) { struct vfs0050_dev *vfs_dev = dev->priv; struct fp_img *img = NULL; int final_height; char *processed_image; tmp_writeout_buf(dev); process_image_data(dev, &processed_image, &final_height); //the fun part img = fpi_img_new(VFS0050_IMG_WIDTH * final_height); if (img == NULL) return 0; memcpy(img->data, processed_image, final_height * VFS0050_IMG_WIDTH); free(processed_image); img->width = VFS0050_IMG_WIDTH; img->height = final_height; img->flags = FP_IMG_V_FLIPPED; fpi_imgdev_image_captured(dev, img); return 1; }
struct fp_img *fpi_im_resize(struct fp_img *img, unsigned int w_factor, unsigned int h_factor) { int new_width = img->width * w_factor; int new_height = img->height * h_factor; pixman_image_t *orig, *resized; pixman_transform_t transform; struct fp_img *newimg; orig = pixman_image_create_bits(PIXMAN_a8, img->width, img->height, (uint32_t *)img->data, img->width); resized = pixman_image_create_bits(PIXMAN_a8, new_width, new_height, NULL, new_width); pixman_transform_init_identity(&transform); pixman_transform_scale(NULL, &transform, pixman_int_to_fixed(w_factor), pixman_int_to_fixed(h_factor)); pixman_image_set_transform(orig, &transform); pixman_image_set_filter(orig, PIXMAN_FILTER_BILINEAR, NULL, 0); pixman_image_composite32(PIXMAN_OP_SRC, orig, /* src */ NULL, /* mask */ resized, /* dst */ 0, 0, /* src x y */ 0, 0, /* mask x y */ 0, 0, /* dst x y */ new_width, new_height /* width height */ ); newimg = fpi_img_new(new_width * new_height); newimg->width = new_width; newimg->height = new_height; newimg->flags = img->flags; memcpy(newimg->data, pixman_image_get_data(resized), new_width * new_height); pixman_image_unref(orig); pixman_image_unref(resized); return newimg; }