Correspondance de modèles basée sur le descripteur Halcon

Tout d'abord, avant de parler de la correspondance de modèles basée sur des descripteurs basés sur Halcon, parlons d'un opérateur. SIFT, ou Scale-invariant feature transform (SIFT), est une description utilisée dans le domaine du traitement d'images. Cette description a une invariance d'échelle, peut détecter des points clés dans l'image et est un descripteur de caractéristiques locales. La fonction SIFT est basée sur certains points d'intérêt d'apparence locale sur l'objet indépendamment de la taille et de la rotation de l'image. La tolérance à la lumière, au bruit et aux micro-changements d'angle de vue est également assez élevée.
L'algorithme SIFT présente les caractéristiques suivantes :
1. La fonction SIFT est une caractéristique locale de l'image, qui maintient l'invariance à la rotation, à la mise à l'échelle et aux changements de luminosité, et maintient également un certain degré de stabilité aux changements d'angle de vue, aux transformations affines et bruit ; 2.
Distinguer La distinction est bonne et la quantité d'informations est riche, ce qui convient à une correspondance rapide et précise dans des bases de données d'entités massives ; 3.
Massivité, même quelques objets peuvent générer un grand nombre de vecteurs d'entités SIFT ;
4. Élevé vitesse, après L'algorithme de correspondance SIFT optimisé peut même répondre aux exigences en temps réel
5. Évolutivité, il peut être facilement combiné avec d'autres formes de vecteurs de caractéristiques.
2. Le principe de détection de modèles basé sur des descripteurs de Halcon est similaire à l'algorithme SIFT. Également keypoint-ahead, le gabarit n'a rien à voir avec le contour. Ses modèles ne sont pas créés à partir de contours de bord, mais à partir de points caractéristiques.
Par exemple, la position d'un point ou les informations d'échelle de gris de pixels adjacents peuvent être utilisées comme descripteur. Les graphiques plats texturés conviennent parfaitement à cette méthode, en particulier pour la mise en correspondance dans des scènes telles que la rotation et l'inclinaison, qui peuvent obtenir des résultats très idéaux. La correspondance basée sur les descripteurs permet un certain degré de déformation de la perspective et peut être effectuée sur des images étiquetées et non étiquetées. La correspondance basée sur les descripteurs n'est pas liée au contour de l'objet, mais étroitement liée à la texture de la cible ou aux points caractéristiques de la cible.
Remarque : la correspondance de modèle basée sur le descripteur ne peut être utilisée que pour les images texturées.
La création d'un modèle basé sur un descripteur est une étape chronophage qui dépend de la complexité de la texture.
3. Le retour sur investissement de l'opérateur peut être de n'importe quelle forme, même plusieurs
zones qui ne sont pas connectées Créer
une description appropriée Modèle
Utiliser les deux méthodes suivantes pour créer un modèle caméra vidéo caméra. La caméra calibrée a besoin des paramètres internes et de la pose de référence de la caméra, et les paramètres des deux autres fonctions sont les mêmes. Examinons ensuite la description du paramètre spécifique et nous vous expliquerons comment



Sélectionner et adapter le détecteur
Ajuster le descripteur
Pour une correspondance calibrée, les paramètres de caméra spécifiés et le
modèle de pose correspondant peuvent être visualisés et modifiés après la création.
La méthode de sélection et d'adaptation d'un détecteur (DetectorType, DetectorParamName, DetectorParamValue)
pour détecter les points intéressants d'une image est appelée un détecteur.
DetectorType spécifie la méthode de détection. Les valeurs possibles sont lepetit, harris, harris_binomial.(Je ne sais pas pourquoi halcon n'inclut pas les opérateurs de détection tels que sift surf, orb). Lepetit est une méthode très rapide pour détecter des points importants, mais elle n'est pas aussi robuste que Harris. En particulier, n'utilisez pas lepetit lorsque le modèle ou l'image recherchée est sombre ou présente un contraste très faible. Harris_binomial est un bon compromis, il est plus rapide que harris mais plus robuste que lepetit.
Pour chaque type de détecteur, un ensemble commun de paramètres est disponible, qui peut être réglé via les paramètres detectorParamName et detectorParamValue. Le premier est utilisé pour spécifier le nom du paramètre générique, et le second est utilisé pour spécifier la valeur correspondante. Nous vous recommandons de tester avec des opérateurs de points sélectionnés avant de créer des modèles. Autrement dit, appliquez l'opérateur point correspondant à l'image du modèle et utilisez par exemple gen_corss_contour_xld. Pour de bons résultats, il devrait y avoir environ 50 à 450 points régulièrement espacés sur l'image du modèle. Ces paramètres peuvent également être définis pour le modèle via create_calib_descriptor_model ou create_uncalib_descriptor_model si un paramétrage approprié pour l'opérateur de point choisi a été trouvé. Notez que dans la plupart des cas, les valeurs par défaut des détecteurs (DetectorParamName et DetectorParamValue définis sur []) sont des effets. déjà très bien.
Ajuster le descripteur (DescriptorParamName DesctiptorParamValue)
implémente désormais un descripteur qui utilise une fougère aléatoire pour classer les points extraits et établit la description de la caractéristique de localisation et le voisinage local en niveaux de gris des points d'intérêt.
Les descripteurs peuvent être ajustés à l'aide des paramètres descriptorParamName et descriptorParamValue. descriptorParamName permet de spécifier le nom du paramètre générique à ajuster et descriptorParamValue permet de spécifier la valeur correspondante.
Il y a deux paramètres, l'un est un paramètre qui contrôle la taille du descripteur, qui contrôle la robustesse, la vitesse et l'utilisation de la mémoire. L'autre est le paramètre de simulation, l'étendue spatiale de la formation de la vue du modèle.
La taille du descripteur est contrôlée par les paramètres suivants :
 profondeur : spécifiez la profondeur de la fougère de classification. Plus la profondeur est grande, mieux les points d'intérêt peuvent être distingués, mais cela augmente le temps de calcul.
 number_ferns—Spécifiez le nombre de structures de fougères, plus le nombre est élevé, plus la robustesse est forte, et augmente également le temps de calcul
 patch_size—Spécifiez la longueur du côté du sous-champ de description, de même, s'il est trop grand, le temps de calcul sera augmenter, et s'il est trop petit, des caractéristiques précises ne peuvent pas être extraites .
Les paramètres de profondeur et de nombre doivent être définis en fonction des différents besoins. Si vous avez besoin d'une correspondance rapide, il est recommandé d'utiliser une petite quantité de profondeur et un grand nombre de fougères. Si vous avez besoin d'une correspondance robuste, vous avez besoin d'une plus grande profondeur, number_ferns doit également être défini plus grand, et en même temps, la vitesse de calcul diminuera considérablement. Si les besoins en mémoire sont stricts, un nombre plus petit de fougères est recommandé. Pour de nombreuses applications, il existe un compromis entre différentes exigences.
Les paramètres de contrôle de simulation contrôlent le train du modèle
 inclinaison - activez ou désactivez la transformation de projection pendant la phase de simulation. L'activer augmentera la robustesse, mais le temps de calcul augmentera également.
 min_rot et max_rot (min_rotation) définissent la plage d'angle de la rotation vectorielle normale du modèle.
 min_scale et max_scale définissent la plage d'échelle du modèle.
La définition d'une petite plage d'angles de rotation et d'une petite plage d'échelle peut considérablement accélérer l'entraînement. Cependant, dans le processus de correspondance d'application ultérieur, il ne peut être trouvé que lorsque l'angle et l'échelle du modèle se situent dans la plage d'apprentissage. De plus, les petites images s'entraînent plus rapidement, de sorte que l'entraînement peut être accéléré en choisissant une petite image de référence et une petite image de modèle et en désactivant l'inclinaison. Mais les images de référence et de recherche doivent avoir la même taille. Ainsi, dans les applications pratiques, le La grande image doit d'abord être mise à l'échelle, puis la formation au modèle, puis l'image réelle collectée doit également être mise à l'échelle de la même manière, puis recherchée. Cela accélérera. Ceci est quelque peu similaire au réseau de neurones, et l'entrée du réseau de neurones ne peut pas être trop grand. Grand, il s'agit donc d'une image relativement petite du côté de l'entrée.
create_uncalib_descriptor_model (ImageReduced, 'harris_binomial', [],
[], ['min_rot','max_rot','min_scale',
'max_scale'], [-90,90,0.2,1.1], 42,
ModelID)
spécifie la caméra paramètres La correspondance avec la pose de référence (camParam,ReferencePose)
pour une caméra d'étalonnage nécessite de spécifier les paramètres de la caméra et la pose de la caméra. Nous recommandons d'utiliser le calibrage de la caméra pour obtenir ces deux paramètres. Une autre méthode alternative pour déterminer la pose de l'avion consiste à mesurer manuellement les étendues du modèle, ce qui est plutôt compliqué et souvent imprécis. Par exemple (vision stéréo, triangulation laser 3d)
pour visualiser et modifier le descripteur Modèle,
vous pouvez visualiser les points d'intérêt dans le modèle grâce à get_descriptor_model_points. Affichez les paramètres du modèle via get_descriptor_model_params. Si le modèle est créé par d'autres programmes ou les paramètres automatiques utilisés lors de la création du modèle, cette méthode peut afficher les paramètres du modèle. Utilisez write_descriptor_model pour enregistrer le modèle et read_descriptor_model pour lire le modèle. De plus, utilisez get_descriptor_model_origin pour interroger l'origine des coordonnées du modèle.
Le modèle peut également être modifié, en utilisant set_descriptor_model_origin pour changer l'origine, mais cela n'est pas recommandé car la précision de correspondance diminuera. Dans les cas où vous devez encore modifier le point de référence et souhaitez appliquer la correspondance de calibrage, nous vous recommandons de vous reporter à la description correspondante de la correspondance de distorsion de perspective. Ici, la relation entre la pose de référence, la pose du modèle et les décalages appliqués manuellement au point de référence est présentée.
Après la correspondance, vous pouvez utiliser get_descriptor_model_points pour interroger les points d'intérêt correspondants. Le paramètre Set doit être défini sur 'search' au lieu de 'model', le code suivant affiche les premiers points d'intérêt du modèle mis en correspondance.
get_descriptor_model_points (ModelIDs[Index2], 'search', 0, Row, Col)
De plus, après la mise en correspondance, get_descriptor_model_results peut être utilisé pour interroger les résultats numériques sélectionnés accumulés pendant la recherche, tels que le score de la correspondance entre un seul point de recherche et le point modèle. (ResultNames défini sur 'point_classification')
Optimiser le processus de recherche
Pour localiser le même point d'intérêt stocké et décrit dans le modèle dans des images inconnues d'objets identiques ou similaires, les opérateurs suivants sont appliqués :  find_calib_descriptor_model recherche
la meilleure correspondance du modèle de descripteur calibré. Renvoie la pose 3D d'un objet et un score correspondant.
 find_uncalib_descriptor_model Recherche la meilleure correspondance du modèle de descripteur non calibré. Il renvoie une matrice de transformation projective 2D (homographie) et un score décrivant la qualité de la correspondance.
La différence entre les deux fonctions est un seul paramètre CamParam. Tout le reste est identique. On suppose ici que les mêmes paramètres de caméra que ceux utilisés pour créer le modèle sont utilisés. Si une caméra différente est utilisée, nous vous recommandons de recalibrer la caméra. Cela signifie que différentes caméras peuvent être utilisées pour la recherche, tant qu'il existe des paramètres de caméra.
Parlons de :
 Limiter l'espace de recherche (ROI)
 Ajuster le détecteur pour rechercher, ceci n'est recommandé que dans de rares cas
 Ajuster le descripteur de recherche
 Définir le seuil du score de similarité ,
MinScore . Restriction de l'espace de recherche La restriction de l'espace de recherche accélère la correspondance. En fait, il s'agit de positionner un switch, puis de réserver une des zones via reduce_main, et de chercher dans cette zone. Ajuster le détecteur à la recherche consiste principalement à modifier DetectorParamName et DetectorParamValue, que nous avons mentionnés lors de la création du modèle. Dans la plupart des cas, ces valeurs n'ont pas besoin d'être modifiées, c'est-à-dire qu'un tuple vide ([ ]) peut être utilisé comme argument. Dans de rares cas, en particulier lorsqu'il y a des changements d'éclairage importants entre l'image de référence et l'image de recherche, vous pouvez modifier la valeur du paramètre. Par exemple, si l'image de recherche est "sombre" et que nous utilisons également "lepetit" comme détecteur, vous pouvez définir "min_score" sur une valeur plus petite. Généralement, pour tester si vous devez modifier la valeur du paramètre, vous pouvez définir le L'opérateur ponctuel correspondant au détecteur est appliqué non seulement à l'image de référence proposée pour la création du modèle, mais également à l'image de recherche. De plus, pour obtenir un bon résultat de correspondance, environ 50 à 450 points uniformément répartis doivent être extraits. Si les opérateurs ponctuels (lepetit, harris, etc.) utilisés par l'image de référence et l'image de recherche nécessitent des paramètres différents, vous devrez peut-être modifier les valeurs des paramètres de détecteur correspondants en conséquence. Ajustez les paramètres du descripteur pour la recherche (DescriptorParamName, DescriptorParamValue) pour contrôler la détermination de la correspondance entre les points d'intérêt. Ajustez l'image de recherche et l'image du modèle en fonction du nom du paramètre de descripteur et de la valeur du paramètre de descripteur. Deux paramètres généraux peuvent être définis :










 min_score_descr—ce paramètre peut être défini sur n'importe quelle valeur supérieure à 0 (de préférence inférieure à 0,1), qui est le seuil de score détecté, ce qui réduira le nombre de points utilisés pour le calcul, améliorant ainsi la vitesse de correspondance. Mais cela réduira la robustesse, surtout lorsque le nombre de points d'extraction est relativement faible.
 guidé_matching - Ceci a deux valeurs, on et off, (la valeur par défaut est on) Si la correspondance guidée est activée, la robustesse de l'estimation de la position du modèle sera améliorée. En particulier, des points sont extraits des images de recherche et classés par des descripteurs. Les points acceptés par la classification sont utilisés pour calculer la matrice de transformation initiale projetée 2D (cas non calibré) ou homogène 3D (cas calibré). Il est ensuite utilisé pour projeter tous les points du modèle dans l'image de recherche. Si le point du modèle projeté est proche de l'un des points extraits d'origine, c'est-à-dire indépendant de sa classification, ce point est utilisé pour le calcul final de l'isomorphisme renvoyé par l'appariement en tant que matrice de transformation projective 2D ou pose 3D, respectivement. En général, s'il n'y a pas de classification, plus de points peuvent être utilisés pour le calcul et l'isomorphisme obtenu est plus fiable. D'autre part, dans certains cas, la vitesse d'appariement peut augmenter jusqu'à 10 %. Donc, si la robustesse n'est pas aussi importante que la vitesse, vous pouvez désactiver le "bootstrapping".
Définir le seuil du score de similarité (minScore)
Le paramètre minscore spécifie le score minimum qu'une correspondance potentielle doit renvoyer comme correspondance. Le score est une valeur pour la qualité de la correspondance, c'est-à-dire la correspondance ou la "similarité" entre le modèle et l'image de recherche. Notez que pour la correspondance basée sur les descripteurs, il existe différents types de scores pour le score du paramètre de sortie. Mais pour le paramètre d'entrée minscore, un score de type "inlier_ratio" est toujours utilisé. Il calcule le rapport entre le nombre de correspondances de points et le nombre de points du modèle. Dans la plupart des cas, minscore doit être défini sur une valeur d'au moins 0,1. Afin d'accélérer la recherche, cette valeur doit être plus grande, mais cette valeur ne doit pas être trop grande, trop grande signifie qu'une correspondance complète est requise, donc cette valeur ne peut pas être trop grande. Par exemple, il est peu probable qu'une correspondance atteigne une valeur de 1,0.
Définir NumMatches, rechercher plusieurs cibles (NumMatches)
Définissez le nombre maximum d'objectifs. Si défini sur 0, toutes les correspondances sont renvoyées. Lorsque vous ciblez plusieurs cibles, le résultat renvoyé est un tuple au lieu d'une valeur, Score, HomMat2D, Pose, etc. La recherche de plusieurs objets n'est qu'un peu plus lente que la recherche d'un seul objet, pas bien pire.
Sélectionnez un type de score (ScoreType)
 num_points – Pour 'num_points', renvoie le nombre de correspondances de points pour chaque instance. Étant donné que quatre correspondances quelconques définissent un isomorphisme mathématiquement correct entre deux images, ce nombre doit être d'au moins 10 pour supposer un résultat de correspondance fiable.
 inlier_ratio – Pour « inlier_ratio », le rapport du nombre de points de retour correspondant au nombre de points du modèle. Bien que la valeur de ce paramètre soit comprise entre 0,0 et 1,0, il est très peu probable qu'une correspondance atteigne un ratio de 1,0. Cependant, un objet doit être ignoré si son rapport interne est inférieur à 0,1.
En règle générale, vous ne pouvez en utiliser qu'un seul ou en utiliser deux. Si vous en utilisez deux, vous devez mettre les deux dans un tuple, et le résultat renverra également un tuple.
4. Cas
4.1 Correspondance de modèles basée sur des descripteurs sans étalonnage, programme source Halcon

这个例子在图片数据库中查找文章页面。
*在第一步中,训练不同的页面并创建模型。
*随后搜索未知图像和正确的文章
检测到几页。
*请注意,这个例子需要一些内存来训练模型。
dev_update_off ()
dev_close_window ()
read_image (Image, 'brochure/brochure_page_01')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_display (Image)
* 
*清除所有已经创建的描述符模型。
ModelIDs := []
ModelsFound := 0
NumPoints := []
NumModels := 3
TotalTime := 0
* 
*为可视化目的创建区域。
RowRoi := [10,10,Height - 10,Height - 10]
ColRoi := [10,Width - 10,Width - 10,10]
gen_rectangle1 (Rectangle, 10, 10, Height - 10, Width - 10)
disp_message (WindowHandle, ['Press \'Run\' to start model creation ...','(may take a few minutes)'], 'window', 10, 10, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
*为每个页面创建描述符模型。
for Index := 1 to NumModels by 1
    read_image (Image, 'brochure/brochure_page_' + Index$'.2')
    rgb1_to_gray (Image, ImageGray)
    get_image_size (ImageGray, Width, Height)
    reduce_domain (ImageGray, Rectangle, ImageReduced)
    dev_clear_window ()
    dev_display (ImageGray)
    disp_message (WindowHandle, 'Creating model no. ' + Index + '/' + NumModels + ' ... please wait.', 'window', 10, 10, 'black', 'true')
    * 
    *使用默认参数创建描述符模型(缩放除外)
    *为了快速检测,选择哈里斯二项点检测器。
    count_seconds (Seconds1)
    create_uncalib_descriptor_model (ImageReduced, 'harris_binomial', [], [], ['min_rot','max_rot','min_scale','max_scale'], [-90,90,0.2,1.1], 42, ModelID)
    count_seconds (Seconds2)
    TotalTime := TotalTime + (Seconds2 - Seconds1)
    * 设置模板中心点为图像中心点(为了在后面的步骤中正确投影矩形的原点)
    set_descriptor_model_origin (ModelID, -Height / 2, -Width / 2)
    ModelIDs := [ModelIDs,ModelID]
    * 从模板中获取所有的描述点
    *存储从模型中提取的点,以备后续匹配。
    get_descriptor_model_points (ModelID, 'model', 'all', Row_D, Col_D)
    NumPoints := [NumPoints,|Row_D|]
endfor
* 
* Model creation finished.
dev_display (ImageGray)
disp_message (WindowHandle, NumModels + ' models created in ' + TotalTime$'.4' + ' seconds.', 'window', 10, 10, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Initialize the window again, because the image size has changed.
read_image (Image, 'brochure/brochure_01')
dev_resize_window_fit_image (Image, 0, 0, -1, -1)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* 
* Main loop:
* Search the models in all images
for Index1 := 1 to 12 by 1
    OutputString := []
    NumMsgs := 0
    ModelsFound := 0
    TotalTime := 0
    read_image (Image, 'brochure/brochure_' + Index1$'.2')
    rgb1_to_gray (Image, ImageGray)
    dev_display (Image)
    disp_message (WindowHandle, 'Searching image ...', 'window', 10, 10, 'black', 'true')
    * 
    * Search every model in each image
    for Index2 := 0 to |ModelIDs| - 1 by 1
        * 
        * Find model (using default parameters)
        count_seconds (Seconds1)
        find_uncalib_descriptor_model (ImageGray, ModelIDs[Index2], 'threshold', 600, ['min_score_descr','guided_matching'], [0.003,'on'], 0.25, 1, 'num_points', HomMat2D, Score)
        count_seconds (Seconds2)
        Time := Seconds2 - Seconds1
        TotalTime := TotalTime + Time
        * 
        * Check if the found instance is to be considered as a possible right match
        * depending on the number of points which were considered
        if ((|HomMat2D| > 0) and (Score > NumPoints[Index2] / 4))
       	    *获取搜索到的描述点坐标
            get_descriptor_model_points (ModelIDs[Index2], 'search', 0, Row, Col)
            gen_cross_contour_xld (Cross, Row, Col, 6, 0.785398)
            * 
            * 利用查找模板结果输出的投影变换矩阵,对原始模板区域仿射变换到当前找到的模板位置。
            * 利用查找模板结果输出的投影变换矩阵,对原始坐标进行变换
            projective_trans_region (Rectangle, TransRegion, HomMat2D, 'bilinear')
            projective_trans_pixel (HomMat2D, RowRoi, ColRoi, RowTrans, ColTrans)
            angle_ll (RowTrans[2], ColTrans[2], RowTrans[1], ColTrans[1], RowTrans[1], ColTrans[1], RowTrans[0], ColTrans[0], Angle)
            Angle := deg(Angle)
            * 
            * Check if the projected rectangle is to be considered as a right match
            * depending on the angle in the right upper edge.
            if (Angle > 70 and Angle < 110)
                area_center (TransRegion, Area, Row, Column)
                ModelsFound := ModelsFound + 1
                dev_set_color ('green')
                dev_set_line_width (4)
                dev_display (TransRegion)
                dev_set_colored (12)
                dev_set_line_width (1)
                dev_display (Cross)
                disp_message (WindowHandle, 'Page ' + (Index2 + 1), 'window', Row, Column, 'black', 'true')
                OutputString := [OutputString,'Page ' + (Index2 + 1) + ' found in ' + (Time * 1000)$'.4' + ' ms\n']
            endif
        endif
    endfor
    if (ModelsFound == 0)
        OutputString := 'No model found'
    endif
    NumMsgs := NumMsgs + 1
    OutputString := ['Search time over all pages: ' + (TotalTime * 1000)$'.4' + ' ms',OutputString]
    disp_message (WindowHandle, OutputString, 'window', 10, 10, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
endfor
dev_display (ImageGray)
disp_message (WindowHandle, 'Program finished.\nPress \'Run\' to clear all descriptor models.', 'window', 10, 10, 'black', 'true')

L'image d'origine
insérez la description de l'image ici
et l'image de résultat
insérez la description de l'image ici
5. Notes
5.1 Le résultat de sortie du modèle de recherche est uniquement le score et la matrice de transformation affine. Il ne produit pas les coordonnées du modèle trouvé comme une correspondance de modèle normale. Cependant, la matrice de sortie HoMat2D peut être utilisée pour effectuer une transformation affine sur la zone de modèle d'origine et les coordonnées de zone pour obtenir la zone de modèle et les coordonnées de zone actuellement recherchées.

Je suppose que tu aimes

Origine blog.csdn.net/Douhaoyu/article/details/128370372
conseillé
Classement