Analyzer.hpp 3.11 KB
Newer Older
Elouan Wauquier's avatar
Elouan Wauquier committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef ANALYZER_H
#define ANALYZER_H

#include <QByteArray>
#include <QImage>
#include <QMap>
#include <QObject>
#include <QPainter>
#include <QPoint>
#include <QPointF>
#include <QVector2D>
#include <QtMath>

#include "fuzzylite/fl/Engine.h"

#include "EndingEngine.hpp"
#include "BifurcationEngine.hpp"
#include "Global.hpp"


// Classe chargée de l'analyse de l'empreinte digitale

class Analyzer : public QObject {
Q_OBJECT
public:
    Analyzer();

    QImage getMinutiaImage(MinutiaEngine::Engine engineType) const; // Génère une image représentant la position de la minutie reconnue par `engineType`

    QImage getSectionImage(int ring, int section) const; // Retourne la section de l'image aux coordonnées spécifiées
    void rasterize(const QImage& src, QImage *dest) const; // Réduit la résolution d'une image à la résolution de `dest`

    void getAnalysisCoordinates(qreal x, qreal y, int *ring, int* section) const;
    MinutiaEngine::Engine getEngine(const QString& engineName) const; // Retourne l'id du FIS `engineName`
    QString getResultsStr() const; // Retourne le résultat de l'analyse

public slots:
    void doLogPolarTransformation(const QImage& src, QPoint center, qreal angle); // Génère `m_transformedImage`
    void doRidgeDistanceCalculation(const QImage& src, QPoint center, qreal angle); // Calcule la taille d'un sillon en pixels (`m_ridgeDistance`)
    void doScanning(); // Réalise le scan de `m_transformedImage`, minutie par minutie

signals:
    void imageTransformed(const QImage* result);
    void scanningDone(const QImage* result);

protected:
    const QImage *m_sourceImage; // Copie de l'image source
    QImage *m_transformedImage; // Image transformée en coordonnées polaire logarithmiques
    QImage *m_rasterizedSection; // Section de `m_transformedImage` fournie à un FIS
    QPointF m_center; // Centre de `m_sourceImage` en pixels
    qreal m_angle; // Angle de départ ($\theta_0$)
    qreal m_radius; // Rayon $r$ utilisé pour la transformation polaire
    qreal m_ridgeDistance; // Distance entre deux sillons en pixels
    QVector<int> m_scanningDivision; // Tableau du nombre de scans pour chaque anneau

    QMap<MinutiaEngine::Engine, MinutiaEngine*> m_engines; // Conteneur des FIS pour chaque minutie
    QMap<MinutiaEngine::Engine, QColor*> m_minutiaColors; // Conteneur des couleurs associées à chaque minutie
    QMap<MinutiaEngine::Engine, QImage*> m_minutiaImages; // Conteneur des images overlay des minuties
    QVector<QVector<qreal>> m_results[static_cast<int>(MinutiaEngine::Engine::NUMBER_OF_ENGINE)]; // Tableau 2D (r, theta) par FIS

    QPointF logPolarToCartesian(const QPointF& src) const; // Converti des coordonnées polaires logarithmiques en coordonnées cartésiennes
    QPointF cartesianToLogPolar(const QPointF& src) const; // Converti des coordonnées cartésiennes en coordonnées polaires logarithmiques

    static uint bilinearInterpolation(const QPointF& px, const QImage& src); // Effectue une interpolation bilinéaire
    static void pasteOnImage(QImage& src1, const QImage& src2, QPoint pos); // Copie une image en nuances de gris sur une autre
};

#endif // ANALYZER_H