Vorlage passend zu NCC
Video-Tutorial 8 – NCC-Vorlagenabgleich: https://singtown.com/learn/49598/
NCC-Algorithmus:
# Template Matching Example - Normalized Cross Correlation (NCC)
#
# This example shows off how to use the NCC feature of your OpenMV Cam to match
# image patches to parts of an image... expect for extremely controlled enviorments
# NCC is not all to useful.
#
# WARNING: NCC supports needs to be reworked! As of right now this feature needs
# a lot of work to be made into somethin useful. This script will reamin to show
# that the functionality exists, but, in its current state is inadequate.
import time, sensor, image
from image import SEARCH_EX, SEARCH_DS
#从imgae模块引入SEARCH_EX和SEARCH_DS。使用from import仅仅引入SEARCH_EX,
#SEARCH_DS两个需要的部分,而不把image模块全部引入。
# Reset sensor
sensor.reset()
# Set sensor settings
sensor.set_contrast(1)
sensor.set_gainceiling(16)
# Max resolution for template matching with SEARCH_EX is QQVGA
sensor.set_framesize(sensor.QQVGA)
# You can set windowing to reduce the search image.
#sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60))
sensor.set_pixformat(sensor.GRAYSCALE)
# Load template.
# Template should be a small (eg. 32x32 pixels) grayscale image.
template = image.Image("/template.pgm")
#加载模板图片
clock = time.clock()
# Run template matching
while (True):
clock.tick()
img = sensor.snapshot()
# find_template(template, threshold, [roi, step, search])
# ROI: The region of interest tuple (x, y, w, h).
# Step: The loop step used (y+=step, x+=step) use a bigger step to make it faster.
# Search is either image.SEARCH_EX for exhaustive search or image.SEARCH_DS for diamond search
#
# Note1: ROI has to be smaller than the image and bigger than the template.
# Note2: In diamond search, step and ROI are both ignored.
r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
#find_template(template, threshold, [roi, step, search]),threshold中
#的0.7是相似度阈值,roi是进行匹配的区域(左上顶点为(10,0),长80宽60的矩形),
#注意roi的大小要比模板图片大,比frambuffer小。
#把匹配到的图像标记出来
if r:
img.draw_rectangle(r)
print(clock.fps())
Beachten Sie, dass wir die SD-Karte einlegen und die folgenden Schritte ausführen müssen, da die Größe unseres Vorlagenbildes den integrierten Flash von openmv überschreitet. (Achten Sie darauf, zuerst die SD-Karte einzulegen und dann das Gerät einzuschalten.) Dieser Vorlagenabgleich kann nur für Firmware-Version 1.6 und höher verwendet werden, andernfalls wird beim Ausführen die Meldung angezeigt, dass SEARCH_EX nicht gefunden werden kann.
Zuerst müssen wir eine Vorlage erstellen oder importieren. Beachten Sie, dass diese Vorlage im PGM-Format vorliegen muss und die Größe begrenzt ist und die Pixelgröße von openmv nicht überschreiten darf. Wir können ein Vorlagenbild direkt von openmv abfangen. Wir können zuerst die Routine helloworld.py ausführen, den Frambuffer das Bild anzeigen lassen und es dann abfangen.
Wählen Sie „Bildauswahl auf PC speichern“. Beachten Sie, dass das direkt von openmv gespeicherte Bild im BMP-Format vorliegt. Wir müssen es in das PGM-Format konvertieren. Die Online-Konvertierung kann auf dieser Website durchgeführt werden https://convertio.co/zh/bmp-pgm/
Anschließend speichern wir die konvertierte PGM-Vorlage auf der SD-Karte (auf dieser SD-Karte befinden sich 8 Vorlagen, und die Vorlage im Bild oben wird als ball0.pgm gespeichert).
Dann öffnen wir die Template-Matching-Routine
Ändern Sie jetzt den Namen der Vorlagendatei template.pgm in Zeile 28 in ball0.pgm
Dann lass es einfach laufen!
Dies ist die Verwendung der Vorlagenvergleichsfunktion find_template:
r = img.find_template(template, 0,7, roi=(10,0,80,60), step=4, search=SEARCH_EX) Der Schwellenwert von 0,7 ist der Ähnlichkeitsschwellenwert, roi Dies ist der Bereich für den Abgleich (der obere linke Scheitelpunkt ist (10, 0), ein Rechteck mit einer Länge von 80 und einer Breite von 60). Beachten Sie, dass die Größe des Roi größer als das Vorlagenbild und kleiner als der Frambuffer ist .
Beachten Sie, dass dieser Vorlagenabgleich den NCC-Algorithmus verwendet, der nur Bereiche mit ähnlicher Größe wie die Vorlage abgleichen kann. Wenn Sie Bilder unterschiedlicher Größe abgleichen möchten, müssen Sie mehrere Vorlagen unterschiedlicher Größe speichern.
Wenn nach dem Ausführen des Programms folgende Probleme auftreten:
- Das Vorlagenbild ist zu groß. Es wird empfohlen, dass das Vorlagenbild kleiner als 80*60 ist
- OpenMV2 verfügt nicht über genügend Speicher, daher müssen Sie QQVGA in QQCIF ändern.
Vergleich von Vorlagenabgleich und Merkmalspunkterkennung:
Vorlagenabgleich (find_temolate) verwendet den NCC-Algorithmus, der nur Muster abgleichen kann, die grundsätzlich die gleiche Größe und den gleichen Winkel wie das Vorlagenbild haben. Die Einschränkungen sind relativ groß. Wenn das Zielmuster im Sichtfeld etwas größer oder kleiner als das Vorlagenbild ist, ist der Abgleich möglicherweise nicht erfolgreich.
Der Vorlagenabgleich eignet sich für Situationen, in denen der Abstand zwischen der Kamera und dem Zielobjekt bestimmt wird und keine dynamische Bewegung erforderlich ist. Es eignet sich beispielsweise für die Erkennung bestimmter Objekte am Fließband, ist jedoch nicht für die Verfolgung eines sich bewegenden Volleyballs durch das Auto geeignet (da der Abstand zwischen dem sich bewegenden Volleyball und der Kamera dynamisch ist und die Größe des von der Kamera gesehenen Volleyballs dynamisch ist). Die Kamera ändert sich und stimmt nicht genau mit dem Vorlagenbild überein.
Für den Abgleich mehrerer Winkel und Größen können Sie versuchen, mehrere Vorlagen zu speichern und Mehrere Vorlagenabgleich zu verwenden.
Feature-Point-Erkennung (find_keypoint): Wenn Sie gerade mit der Ausführung des Programms begonnen haben, extrahiert die Routine das erste Bild als Zielobjekt-Feature und kpts1 speichert das Zielobjekt-Feature. Standardmäßig werden mehrere Proportionen, Größen und Winkel des Zielmerkmals abgeglichen, nicht nur die Größe und der Winkel beim Speichern des Zielmerkmals. Es ist flexibler als der Vorlagenabgleich und erfordert nicht das Speichern mehrerer Vorlagenbilder wie der Mehrfachvorlagenabgleich.
Für die Erkennung von Merkmalspunkten können Sie Zielmerkmale auch im Voraus speichern. Dies wurde bisher nicht empfohlen, da Störungen durch Umgebungslicht und andere Gründe bei jeder Ausführung des Programms zu unterschiedlichen Merkmalen bei unterschiedlichen Lichtern führen können und der Übereinstimmungsgrad verringert wird. Die neueste Version der Firmware fügt jedoch Anpassungen der Belichtungs-, Weißabgleich- und automatischen Verstärkungswerte hinzu. Der Belichtungswert und der Weißabgleichswert können künstlich definiert werden, wodurch die Lichtinterferenz relativ abgeschwächt wird. Sie können auch versuchen, die Zielfunktionen vorab zu speichern.