Rilevamento dei punti caratteristici

Tutorial video 16 - Rilevamento e salvataggio di punti caratteristici: https://singtown.com/learn/50021/

Confronto tra la corrispondenza del modello e il rilevamento dei punti caratteristici:
  • Corrispondenza modello (trova_temolate) utilizza l'algoritmo ncc, che può far corrispondere solo modelli che hanno sostanzialmente la stessa dimensione e angolo dell'immagine modello. Le limitazioni sono relativamente grandi. Se il modello di destinazione nel campo visivo è leggermente più grande o più piccolo dell'immagine modello, la corrispondenza potrebbe non avere esito positivo.

  • La corrispondenza del modello è adatta per situazioni in cui viene determinata la distanza tra la telecamera e l'oggetto target e non è richiesto un movimento dinamico. Ad esempio, è adatto per il rilevamento di oggetti specifici sulla catena di montaggio, ma non adatto per l'auto per seguire un pallone in movimento (perché la distanza tra il pallone in movimento e la telecamera è dinamica, la dimensione del pallone visto dal la fotocamera cambierà e non sarà esattamente la stessa dell'immagine del modello).

  • Per la corrispondenza di più angolazioni e più dimensioni, puoi provare a salvare più modelli e utilizzare Corrispondenza di più modelli.

  • Rilevamento punto caratteristica (find_keypoint): Se hai appena iniziato a eseguire il programma, la routine estrae la prima immagine come caratteristica dell'oggetto di destinazione e kpts1 salva la caratteristica dell'oggetto di destinazione. Per impostazione predefinita, corrisponderà a più proporzioni, dimensioni e angoli della funzione di destinazione, non solo alle dimensioni e all'angolo durante il salvataggio della funzione di destinazione. È più flessibile della corrispondenza dei modelli e non richiede il salvataggio di più immagini del modello come la corrispondenza di più modelli.

  • Per il rilevamento dei punti caratteristici, è anche possibile salvare in anticipo le caratteristiche del target. Ciò non era consigliato in precedenza poiché l'interferenza della luce ambientale e altri motivi potrebbero causare caratteristiche diverse di luci diverse ogni volta che si esegue il programma e il grado di corrispondenza verrà ridotto. Tuttavia, nell'ultima versione del firmware, sono state aggiunte regolazioni all'esposizione, al bilanciamento del bianco e ai valori di guadagno automatico. I valori di esposizione e di bilanciamento del bianco possono essere definiti artificialmente, il che indebolirà relativamente l'interferenza della luce . Puoi anche provare a salvare in anticipo le funzionalità di destinazione.


Rilevamento dei punti caratteristici

Questa routine è 09-feature-Detection-keypoints.py\ Questa routine utilizza l'algoritmo FAST/AGAST per l'estrazione delle caratteristiche e il tracciamento dei target e supporta solo immagini in scala di grigi.

Nota: questa routine utilizzerà gli oggetti che appaiono nei primi dieci secondi del programma come elementi di destinazione. Posizionare l'oggetto di destinazione al centro della telecamera per l'identificazione all'inizio del programma finché non viene visualizzato l'angolo della funzione, dimostrando che l'oggetto è visibile. l'obiettivo è stato identificato e registrato.

Durante il processo di abbinamento, se sullo schermo compaiono croci e riquadri rettangolari, ciò dimostra che l'abbinamento è riuscito.

# 利用特征点检测特定物体例程。
# 向相机显示一个对象,然后运行该脚本。 一组关键点将被提取一次,然后
# 在以下帧中进行跟踪。 如果您想要一组新的关键点,请重新运行该脚本。
# 注意:请参阅文档以调整find_keypoints和match_keypoints。
import sensor, time, image

# Reset sensor
sensor.reset()

# Sensor settings
sensor.set_framesize(sensor.VGA)
sensor.set_windowing((320, 240))
sensor.set_pixformat(sensor.GRAYSCALE)

sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)

#画出特征点
def draw_keypoints(img, kpts):
    if kpts:
        print(kpts)
        img.draw_keypoints(kpts)
        img = sensor.snapshot()
        time.sleep_ms(1000)

kpts1 = None
#kpts1保存目标物体的特征,可以从文件导入特征,但是不建议这么做。
#kpts1 = image.load_descriptor("/desc.orb")
#img = sensor.snapshot()
#draw_keypoints(img, kpts1)

clock = time.clock()

while (True):
    clock.tick()
    img = sensor.snapshot()
    if (kpts1 == None):
        #如果是刚开始运行程序,提取最开始的图像作为目标物体特征,kpts1保存目标物体的特征
        #默认会匹配目标特征的多种比例大小,而不仅仅是保存目标特征时的大小,比模版匹配灵活。
        # NOTE: By default find_keypoints returns multi-scale keypoints extracted from an image pyramid.
        kpts1 = img.find_keypoints(max_keypoints=150, threshold=10, scale_factor=1.2)
        #image.find_keypoints(roi=Auto, threshold=20, normalized=False, scale_factor=1.5, max_keypoints=100, corner_detector=CORNER_AGAST)
        #roi表示识别的区域,是一个元组(x,y,w,h),默认与framsesize大小一致。
        #threshold是0~255的一个阈值,用来控制特征点检测的角点数量。用默认的AGAST特征点检测,这个阈值大概是20。用FAST特征点检测,这个阈值大概是60~80。阈值越低,获得的角点越多。
        #normalized是一个布尔数值,默认是False,可以匹配目标特征的多种大小(比ncc模版匹配效果灵活)。如果设置为True,关闭特征点检测的多比例结果,仅匹配目标特征的一种大小(类似于模版匹配),但是运算速度会更快一些。
        #scale_factor是一个大于1.0的浮点数。这个数值越高,检测速度越快,但是匹配准确率会下降。一般在1.35~1.5左右最佳。
        #max_keypoints是一个物体可提取的特征点的最大数量。如果一个物体的特征点太多导致RAM内存爆掉,减小这个数值。
        #corner_detector是特征点检测采取的算法,默认是AGAST算法。FAST算法会更快但是准确率会下降。
        draw_keypoints(img, kpts1)
        #画出此时的目标特征
    else:
        #当与最开始的目标特征进行匹配时,默认设置normalized=True,只匹配目标特征的一种大小。
        # NOTE: When extracting keypoints to match the first descriptor, we use normalized=True to extract
        # keypoints from the first scale only, which will match one of the scales in the first descriptor.
        kpts2 = img.find_keypoints(max_keypoints=150, threshold=10, normalized=True)
        #如果检测到特征物体
        if (kpts2):
            #匹配当前找到的特征和最初的目标特征的相似度
            match = image.match_descriptor(kpts1, kpts2, threshold=85)
            #image.match_descriptor(descritor0, descriptor1, threshold=70, filter_outliers=False)。本函数返回kptmatch对象。
            #threshold阈值设置匹配的准确度,用来过滤掉有歧义的匹配。这个值越小,准确度越高。阈值范围0~100,默认70
            #filter_outliers默认关闭。

            #match.count()是kpt1和kpt2的匹配的近似特征点数目。
            #如果大于10,证明两个特征相似,匹配成功。
            if (match.count()>10):
                # If we have at least n "good matches"
                # Draw bounding rectangle and cross.
                #在匹配到的目标特征中心画十字和矩形框。
                img.draw_rectangle(match.rect())
                img.draw_cross(match.cx(), match.cy(), size=10)

            #match.theta()是匹配到的特征物体相对目标物体的旋转角度。
            print(kpts2, "matched:%d dt:%d"%(match.count(), match.theta()))
            #不建议draw_keypoints画出特征角点。
            # NOTE: uncomment if you want to draw the keypoints
            #img.draw_keypoints(kpts2, size=KEYPOINTS_SIZE, matched=True)

    # Draw FPS
    #打印帧率。
    img.draw_string(0, 0, "FPS:%.2f"%(clock.fps()))

Effetto dell'esecuzione del programma:

results matching ""

    No results matching ""