find_small_apriltags.py

# Questo lavoro è concesso in licenza MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Tutti i diritti riservati.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Trova piccoli AprilTags
#
# Questo script mostra come utilizzare il tracciamento dei blob come pre-filtro per
# trovare gli AprilTags nell'immagine, usando il tracciamento dei blob per individuare
# prima l'area in cui si trova il tag e quindi chiamando find_apriltags
# su quel blob.

# Nota: questo script funziona bene supponendo che la maggior parte dell'immagine non
# superi il test di sogliatura... altrimenti non si ottiene alcun vantaggio di
# distanza.

# Utilizzare la famiglia di tag TAG36H11 per questo script: è la famiglia di tag consigliata.

import csi
import time

# Impostare le soglie per trovare un oggetto bianco (cioè il bordo del tag)
thresholds = (150, 255)

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.snapshot(time=200)  # aumentare questo valore per lasciare che i metodi automatici vengano eseguiti più a lungo
csi0.auto_gain(False)  # deve essere disattivato per il tracciamento del colore
csi0.auto_whitebal(False)  # deve essere disattivato per il tracciamento del colore

clock = time.clock()

while True:
    clock.tick()
    img = csi0.snapshot()

    # Per prima cosa troviamo i blob che potrebbero essere candidati per i tag.
    box_list = []

    # AprilTags potrebbe fallire per mancanza di RAM sufficiente, data la dimensione dell'immagine passata.
    tag_list = []

    for blob in img.find_blobs(
        [thresholds], pixels_threshold=100, area_threshold=100, merge=True
    ):
        # Successivamente cerchiamo un tag in una ROI più grande del blob.
        w = min(max(int(blob.w * 1.2), 10), 160)  # Non troppo piccola, non troppo grande.
        h = min(max(int(blob.h * 1.2), 10), 160)  # Non troppo piccola, non troppo grande.
        x = min(max(int(blob.x + (blob.w / 4) - (w * 0.1)), 0), img.width() - 1)
        y = min(max(int(blob.y + (blob.h / 4) - (h * 0.1)), 0), img.height() - 1)

        box_list.append((x, y, w, h))  # Le disegneremo più avanti.

        # Poiché limitiamo la dimensione della ROI, apriltags non dovrebbe esaurire la RAM.
        # Ma, se ciò accade, lo gestiamo...
        try:
            tag_list.extend(img.find_apriltags(roi=(x, y, w, h)))
        except (
            MemoryError
        ):  # Non catturare tutte le eccezioni, altrimenti non è possibile interrompere lo script.
            pass

    for b in box_list:
        img.draw_rectangle(b)
    # Ora stampa i tag trovati
    for tag in tag_list:
        img.draw_detection(tag)
        for c in tag.corners:
            img.draw_circle((c[0], c[1], 5))
        print("Tag:", tag.cx, tag.cy, tag.rotation, tag.id)

results matching ""

    No results matching ""