/* Overlays bounding boxes and landmarks from tracks onto a copy of the images in the list */ void sdk_draw_utils_overlay_track_list_on_image_list( sdk_utils_file_list_type in_image_list, ppr_track_list_type track_list, int min_confidence, int overlay_frame_numbers, const char *output_image_format) { int i; int frame_num; int *i_tracked_face_lists; ppr_raw_image_type raw_image; char title[FILENAME_MAX]; char out_filename[FILENAME_MAX]; ppr_face_attributes_type face_attributes; /* Create array of indices into tracked face arrays */ i_tracked_face_lists = (int*)malloc(track_list.length * sizeof(int)); sdk_utils_check_allocation(i_tracked_face_lists, "i_tracked_face_lists", __FUNCTION__); for (i = 0; i < track_list.length; i++) i_tracked_face_lists[i] = 0; /* Loop through each image in list */ for (frame_num = 0; frame_num < in_image_list.length; frame_num++) { /* Read image */ TRY_RAW_IMAGE(ppr_raw_image_io_read(in_image_list.filenames[frame_num], &raw_image)); /* Overlay polygons on frame */ sdk_draw_utils_advance_indices_to_frame(track_list, i_tracked_face_lists, frame_num); for (i = 0; i < track_list.length; i++) { ppr_get_face_attributes(track_list.tracks[i].tracked_faces.faces[i_tracked_face_lists[i]], &face_attributes); if (face_attributes.tracking_info.frame_number == frame_num) { /* Overlay polygon for this face */ sdk_draw_utils_overlay_tracked_faces(&raw_image, 1, &track_list.tracks[i].tracked_faces.faces[i_tracked_face_lists[i]], min_confidence); } } /* Overlay frame number on frame */ if (overlay_frame_numbers) sdk_draw_utils_overlay_frame_number(&raw_image, frame_num); /* Write image to file */ sdk_utils_get_file_title(in_image_list.filenames[frame_num], title); sprintf(out_filename, "%s_track_overlay.%s", title, output_image_format); TRY_RAW_IMAGE(ppr_raw_image_io_write(out_filename, raw_image)); /* Free image */ ppr_raw_image_free(raw_image); } /* Clean up */ free(i_tracked_face_lists); }
janus_error janus_read_image(const char *file_name, janus_image *image) { ppr_raw_image_type ppr_image; ppr_raw_image_error_type error = ppr_raw_image_io_read(file_name, &ppr_image); if (error != PPR_RAW_IMAGE_SUCCESS) return JANUS_INVALID_IMAGE; *image = janusFromPittPatt(&ppr_image); ppr_raw_image_free(ppr_image); return JANUS_SUCCESS; }
janus_error janus_read_frame(janus_video video, janus_image *image) { ppr_raw_image_type ppr_frame; ppr_video_io_error_type error = ppr_video_io_get_frame((ppr_video_io_type)video, &ppr_frame); error = error || ppr_video_io_step_forward((ppr_video_io_type)video); if (error != PPR_VIDEO_IO_SUCCESS) return JANUS_INVALID_VIDEO; *image = janus_from_pittpatt(&ppr_frame); ppr_raw_image_free(ppr_frame); return JANUS_SUCCESS; }
/* Overlays bounding boxes and landmarks from tracks onto copies of the frames in the video */ void sdk_draw_utils_overlay_track_list_on_video( const char *in_filename, ppr_track_list_type track_list, int min_confidence, int overlay_frame_numbers, const char *output_video_format) { int i; int frame_num; ppr_video_io_type input_video; ppr_video_io_type output_video; int frame_rate_numerator; int frame_rate_denominator; int *i_tracked_face_lists; ppr_face_attributes_type face_attributes; ppr_raw_image_type raw_image; char title[FILENAME_MAX]; char out_filename[FILENAME_MAX]; /* Open video */ TRY_VIDEO(ppr_video_io_open(&input_video, in_filename)); TRY_VIDEO(ppr_video_io_get_frame_rate(input_video, &frame_rate_numerator, &frame_rate_denominator)); /* Create output video */ sdk_utils_get_file_title(in_filename, title); sprintf(out_filename, "%s_track_overlay.%s", title, output_video_format); TRY_VIDEO(ppr_video_io_create(&output_video, out_filename, BIT_RATE, frame_rate_numerator, frame_rate_denominator)); /* Create array of indices into tracked face arrays */ i_tracked_face_lists = (int*)malloc(track_list.length * sizeof(int)); sdk_utils_check_allocation(i_tracked_face_lists, "i_tracked_face_lists", __FUNCTION__); for (i = 0; i < track_list.length; i++) i_tracked_face_lists[i] = 0; /* Loop through each frame of video */ frame_num = 0; while (ppr_video_io_is_frame_available(input_video)) { /* Read frame from video */ TRY_VIDEO(ppr_video_io_get_frame(input_video, &raw_image)); /* Overlay polygons on frame */ sdk_draw_utils_advance_indices_to_frame(track_list, i_tracked_face_lists, frame_num); for (i = 0; i < track_list.length; i++) { ppr_get_face_attributes(track_list.tracks[i].tracked_faces.faces[i_tracked_face_lists[i]], &face_attributes); if (face_attributes.tracking_info.frame_number == frame_num) { /* Overlay polygon for this face */ sdk_draw_utils_overlay_tracked_faces(&raw_image, 1, &track_list.tracks[i].tracked_faces.faces[i_tracked_face_lists[i]], min_confidence); } } /* Overlay frame number on frame */ if (overlay_frame_numbers) sdk_draw_utils_overlay_frame_number(&raw_image, frame_num); /* Write frame to output video */ TRY_VIDEO(ppr_video_io_add_frame(output_video, raw_image)); /* Free frame */ ppr_raw_image_free(raw_image); /* Advance to next frame */ TRY_VIDEO(ppr_video_io_step_forward(input_video)); frame_num++; } /* Close video */ TRY_VIDEO(ppr_video_io_close(input_video)); TRY_VIDEO(ppr_video_io_close(output_video)); /* Clean up */ free(i_tracked_face_lists); }
void sdk_print_utils_print_face(ppr_context_type context, ppr_face_type face) { int rv; ppr_string_type face_string; ppr_face_attributes_type face_attributes; ppr_landmark_list_type landmark_list; ppr_polygon_type face_boundary; ppr_raw_image_type thumbnail; ppr_settings_type settings; int is_extractable; int has_template; TRY(ppr_get_face_attributes(face, &face_attributes)); sdk_print_utils_print_face_attributes(face_attributes); TRY(ppr_get_face_landmarks(face, &landmark_list)); sdk_print_utils_print_landmark_list(landmark_list); TRY(ppr_get_face_boundary(face, PPR_BOUNDING_BOX_STYLE_DEFAULT, &face_boundary)); printf("----------------------------------------------------------------------\n"); printf(" Default Bounding Box Style \n"); printf("----------------------------------------------------------------------\n"); sdk_print_utils_print_polygon(face_boundary); printf("----------------------------------------------------------------------\n"); printf("----------------------------------------------------------------------\n"); printf(" Additional Info\n"); printf("----------------------------------------------------------------------\n"); TRY(ppr_get_face_string(context, face, &face_string)); printf(" - String: %s\n", face_string.str); rv = ppr_get_face_thumbnail(context, face, &thumbnail); if (rv == PPR_SUCCESS) { printf(" - Face HAS THUMBNAIL\n"); ppr_raw_image_free(thumbnail); } else if (rv == PPR_NO_THUMBNAIL) { printf(" - Face DOES NOT have thumbnail\n"); } else { fprintf(stderr, "ERROR - %s: ppr_get_face_thumbnail", ppr_error_message(rv)); fprintf(stderr, " (%s:%d)\n", __FILE__, __LINE__); ppr_finalize_sdk(); exit(EXIT_FAILURE); } TRY(ppr_get_settings(context, &settings)); if (settings.recognition.enable_extraction) { TRY(ppr_is_template_extractable(context, face, &is_extractable)); if (is_extractable) printf(" - Template CAN be extracted\n"); else printf(" - Template CANNOT be extracted\n"); TRY(ppr_face_has_template(context, face, &has_template)); if (has_template) printf(" - Face HAS template\n"); else printf(" - Face DOES NOT have template\n"); } printf("----------------------------------------------------------------------\n"); ppr_free_string(face_string); ppr_free_landmark_list(landmark_list); ppr_free_polygon(face_boundary); }