13#include "enrollment/Export.h"
51 virtual void ConfigureExtractionParameters(
const std::shared_ptr<Print>& print,
52 inno_ICSExtractor_params& params) = 0;
56 virtual void OnCreated() = 0;
62 virtual void CheckCompatibility(inno_ICSExtractor_params& params) = 0;
66 Artifact(
const Artifact&) =
delete;
67 Artifact(Artifact&&) =
delete;
68 Artifact& operator=(
const Artifact&) =
delete;
69 Artifact& operator=(Artifact&& c) =
delete;
70 virtual ~Artifact() =
default;
72 friend class ICSExtractor;
78 class Artifacts :
public Artifact
89 void Add(Artifact& artifact)
91 const std::lock_guard lock(artifactsMux);
93 if (isExtractionInProgress)
98 inno_ICSExtractor_params param = {};
100 for (
auto* a : artifacts)
102 a->CheckCompatibility(param);
106 artifact.CheckCompatibility(param);
108 artifacts.emplace_back(&artifact);
118 void ConfigureExtractionParameters(
const std::shared_ptr<Print>& print,
119 inno_ICSExtractor_params& params)
final
121 const std::lock_guard lock(artifactsMux);
123 for (
auto* a : artifacts)
125 a->ConfigureExtractionParameters(print, params);
128 isExtractionInProgress =
true;
133 void OnCreated() final
135 const std::lock_guard lock(artifactsMux);
137 for (
auto* a : artifacts)
142 isExtractionInProgress =
false;
150 void CheckCompatibility(inno_ICSExtractor_params& params)
final
152 const std::lock_guard lock(artifactsMux);
154 for (
auto* a : artifacts)
156 a->CheckCompatibility(params);
160 std::vector<Artifact*> artifacts;
161 std::mutex artifactsMux;
162 bool isExtractionInProgress =
false;
165 Artifacts() =
default;
166 Artifacts(
const Artifacts&) =
delete;
167 Artifacts(Artifacts&&) =
delete;
168 Artifacts& operator=(
const Artifacts&) =
delete;
169 Artifacts& operator=(Artifacts&& c) =
delete;
170 virtual ~Artifacts() =
default;
182 class SkeletonImage :
public Artifact
191 [[nodiscard]] std::shared_ptr<Image>
GetImage()
const
193 if (image ==
nullptr)
206 [[nodiscard]] std::shared_ptr<Image>
DrawMinutiae(
const std::vector<std::shared_ptr<Minutia>>& minutiae,
219 const std::vector<std::shared_ptr<CriticalPoint>>& points,
236 std::shared_ptr<ImageEncoder> encoder;
237 std::vector<uint8_t> data;
238 std::shared_ptr<Image> image;
240 void ConfigureExtractionParameters(
const std::shared_ptr<Print>& print,
241 inno_ICSExtractor_params& params)
final
243 width = print->image->Width();
244 height = print->image->Height();
245 dpi = print->image->Dpi();
246 encoder = print->image->OriginalEncoder();
248 data.resize(
static_cast<size_t>(height) *
static_cast<size_t>(width));
250 params.skeletonImage = data.data();
253 void OnCreated() final
258 void CheckCompatibility(inno_ICSExtractor_params& params)
final
260 if (params.skeletonImage !=
nullptr)
262 throw EnrollmentRuntimeException(
"skeleton artifact is already enabled");
264 static unsigned char c = 0;
265 params.skeletonImage = &c;
278 class FilteredImage :
public Artifact
287 [[nodiscard]] std::shared_ptr<Image>
GetImage()
const
289 if (image ==
nullptr)
307 std::shared_ptr<ImageEncoder> encoder;
308 std::vector<uint8_t> data;
309 std::shared_ptr<Image> image;
311 void ConfigureExtractionParameters(
const std::shared_ptr<Print>& print,
312 inno_ICSExtractor_params& params)
final
314 width = print->image->Width();
315 height = print->image->Height();
316 dpi = print->image->Dpi();
317 encoder = print->image->OriginalEncoder();
319 data.resize(
static_cast<size_t>(height) *
static_cast<size_t>(width));
321 params.filteredImage = data.data();
324 void OnCreated() final
330 void CheckCompatibility(inno_ICSExtractor_params& params)
final
332 if (params.filteredImage !=
nullptr)
334 throw EnrollmentRuntimeException(
"filtered artifact is already enabled");
337 static unsigned char c = 0;
338 params.filteredImage = &c;
351 class BinarizedImage :
public Artifact
360 [[nodiscard]] std::shared_ptr<Image>
GetImage()
const
362 if (image ==
nullptr)
380 std::shared_ptr<ImageEncoder> encoder;
381 std::vector<uint8_t> data;
382 std::shared_ptr<Image> image;
384 void ConfigureExtractionParameters(
const std::shared_ptr<Print>& print,
385 inno_ICSExtractor_params& params)
final
387 width = print->image->Width();
388 height = print->image->Height();
389 dpi = print->image->Dpi();
390 encoder = print->image->OriginalEncoder();
392 data.resize(
static_cast<size_t>(height) *
static_cast<size_t>(width));
394 params.binarizedImage = data.data();
397 void OnCreated() final
403 void CheckCompatibility(inno_ICSExtractor_params& params)
final
405 if (params.binarizedImage !=
nullptr)
407 throw EnrollmentRuntimeException(
"binarized artifact is already enabled");
410 static unsigned char c = 0;
411 params.binarizedImage = &c;
425 std::shared_ptr<ExtractedPrint>
Extract(std::shared_ptr<Print> print,
Artifact& artifact)
427 if (print ==
nullptr)
432 log.LogInfo(
"Print extraction for %v ...", print);
434 uint8_t* outTemplate =
nullptr;
435 unsigned int outTemplateSize = 0;
437 inno_ICSExtractor_params params = {};
438 auto gs = print->image->AsRawGrayscale();
439 params.height = gs.height;
440 params.width = gs.width;
441 params.data = gs.Data().data();
442 params.dpi =
static_cast<unsigned int>(gs.dpi);
444 artifact.ConfigureExtractionParameters(print, params);
446 exec->Extract(¶ms, slog.
GetCallbacks(), &outTemplate, &outTemplateSize, ThrowOnError{});
448 artifact.OnCreated();
450 std::vector<uint8_t> templateData(outTemplate, std::next(outTemplate, outTemplateSize));
451 exec->FreeTemplate(outTemplate, outTemplateSize);
453 auto extractedPrint = std::make_shared<ExtractedPrint>(std::move(templateData), std::move(print), exec);
454 log.LogInfo(
"Print extraction result %v", extractedPrint);
456 return extractedPrint;
468 std::shared_ptr<ExtractedPrint>
Extract(
const std::shared_ptr<Print>& print)
470 auto nullArtifact = NullArtifact();
471 return Extract(print, nullArtifact);
488 explicit ICSExtractor(std::shared_ptr<PrintExecutor> executor)
490 , exec(std::move(executor))
504 class NullArtifact final :
public Artifact
507 void ConfigureExtractionParameters(
const std::shared_ptr<Print>& ,
508 inno_ICSExtractor_params& )
final
511 void OnCreated() final
514 void CheckCompatibility(inno_ICSExtractor_params& )
final
519 NullArtifact() =
default;
520 NullArtifact(
const NullArtifact&) =
delete;
521 NullArtifact(NullArtifact&&) =
delete;
522 NullArtifact& operator=(
const NullArtifact&) =
delete;
523 NullArtifact& operator=(NullArtifact&& c) =
delete;
524 virtual ~NullArtifact() =
default;
527 FormattingLogger log;
528 std::shared_ptr<PrintExecutor> exec;
constexpr ImageDpi DefaultDpi
Provides default DPI Default DPI is 500.
Definition ImageAttribute.h:107
CallbackLogger is logger for binary part of libary due to C boundary.
Definition Logger.h:157
LoggerCallBacks GetCallbacks() const
Get the Callbacks object.
Definition Logger.h:166
It draws collection of CriticalPoint into image.
Definition CriticalPoint.h:181
Base exception for all enrollment-sdk runtime exceptions.
Definition EnrollmentException.h:84
Holds instance of Logger.
Definition Logger.h:275
Holds instance of PrintExecutor.
Definition PrintExecutor.h:1300
Image DPI.
Definition ImageAttribute.h:47
It holds shape attributes such as color and line width.
Definition ImageShape.h:22
static std::shared_ptr< Image > DecodeRawImage(const RawImage &raw, std::shared_ptr< ImageEncoder > originalEncoder=nullptr, std::shared_ptr< ImageExecutor > executor=GlobalImageExecutor::Get())
Creates Image from raw data.
Definition Image.h:200
Interface for library logging.
Definition Logger.h:45
It draws Minutia into image.
Definition Minutia.h:188
Null argument is not allowed.
Definition EnrollmentException.h:156
Contains plain image data.
Definition ImageAttribute.h:135
@ GRAYSCALE
Raw data where image pixels are stored in grayscale format.
Definition ImageAttribute.h:146
ImageDimension ImageHeight
Image Height.
Definition ImageAttribute.h:36
ImageDimension ImageWidth
Image Width.
Definition ImageAttribute.h:41