Finden Sie Farbblöcke
Video-Tutorial 4 – Farberkennung: https://singtown.com/learn/49993/
find_blobs-Funktion
Das Verfolgen des Balls ist die am häufigsten verwendete Funktion von OpenMV. Sie finden Sie in Erste Schritte schnell in 10 Minuten\ Farbblöcke können über die Funktion „find_blobs“ gefunden werden. Lassen Sie uns die Details von „find_blobs“ besprechen.
image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)
Hier gibt es viele Parameter.
- „thresholds“ ist der Farbschwellenwert. Hinweis: Dieser Parameter ist eine Liste und kann mehrere Farben enthalten. Wenn Sie nur eine Farbe benötigen, benötigen Sie in dieser Liste nur einen Farbwert. Wenn Sie mehrere Farbschwellenwerte wünschen, sind in dieser Liste mehrere Farbschwellenwerte erforderlich. Hinweis: Sie können die Codemethode für den zurückgegebenen Farbblock-Objekt-Blob aufrufen, um zu bestimmen, welche Farbe der Farbblock hat.
red = (xxx,xxx,xxx,xxx,xxx,xxx)
blue = (xxx,xxx,xxx,xxx,xxx,xxx)
yellow = (xxx,xxx,xxx,xxx,xxx,xxx)
img=sensor.snapshot()
red_blobs = img.find_blobs([red])
color_blobs = img.find_blobs([red,blue, yellow])
roi ist „Region of Interest“. Es wurde in Nutzungsstatistiken eingeführt.
left_roi = [0,0,160,240]\ blobs = img.find_blobs([red],roi=left_roi)
x_stride ist das Pixel mit der kleinsten Breite in der x-Richtung des gesuchten Farbblocks. Der Standardwert ist 2. Wenn Sie nur Farbblöcke mit einer Breite von mehr als 10 Pixeln finden möchten, setzen Sie diesen Parameter auf 10:
blobs = img.find_blobs([red],x_stride=10)
y_stride ist das Pixel mit der kleinsten Breite in der y-Richtung des gesuchten Farbblocks. Der Standardwert ist 1. Wenn Sie nur Farbblöcke mit einer Breite von mehr als 5 Pixeln finden möchten, setzen Sie diesen Parameter auf 5:
blobs = img.find_blobs([red],y_stride=5)
Invertieren kehrt den Schwellenwert um und sucht nach anderen Farben als dem Schwellenwert als Schwellenwert.
Bereich_threshold Bereichsschwellenwert: Wenn der umrahmte Bereich des Farbblocks kleiner als dieser Wert ist, wird er herausgefiltert
pixels_threshold Pixelanzahlschwellenwert. Wenn die Anzahl der Pixel im Farbblock unter diesem Wert liegt, wird er herausgefiltert
merge Merge, wenn auf True gesetzt, werden alle überlappenden Blobs zu einem zusammengeführt.\ HINWEIS: Dadurch werden alle Blobs zusammengeführt, unabhängig von ihrer Farbe. Wenn Sie Blobs mehrerer Farben mischen möchten, rufen Sie einfach find_blobs mit unterschiedlichen Farbschwellenwerten separat auf.
all_blobs = img.find_blobs([red,blue,yellow],merge=True)
red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs = img.find_blobs([yellow],merge=True)
- Randgrenze: Wenn der Wert auf 1 gesetzt ist, werden zwei Blobs zusammengeführt, wenn sie einen Pixel voneinander entfernt sind.
Schwelle
Der Aufbau einer Farbschwelle sieht folgendermaßen aus:
red = (minL, maxL, minA, maxA, minB, maxB)
Die Werte im Tupel sind die Maximal- bzw. Minimalwerte von L A B.
Wenn Sie diesen Schwellenwert im IDE-Image erhalten möchten, lesen Sie: [Schneller Einstieg in 10 Minuten] (/quick-starter.md)
In der neuen Version der IDE gibt es ein komfortableres Schwellenwertauswahltool, siehe unten.
Werkzeug zur Auswahl des Farbschwellenwerts
Der OpenMV-IDE wurde ein Schwellenwertauswahltool hinzugefügt, das das Debuggen von Farbschwellenwerten erheblich erleichtert.
Führen Sie zunächst hello world.py aus, damit der Framebuffer in der IDE das Muster anzeigt.\ \ Öffnen Sie dann Extras → Mechine Vision → Schwellenwert-Editor\
Klicken Sie auf Frame Buffer, um das Bild in der IDE abzurufen, und auf Image File, um selbst eine Bilddatei auszuwählen.
Ziehen Sie die sechs Schieberegler, um die Schwellenwertergebnisse in Echtzeit anzuzeigen. Das gewünschte Ergebnis besteht darin, unsere Zielfarbe in Weiß und alle anderen Farben in Schwarz umzuwandeln.
Blobs ist eine Liste
Das Objekt find_blobs gibt eine Liste mehrerer Blobs zurück. (Beachten Sie den Unterschied zwischen Blobs und Blobs. Dies ist nur ein Name, der verwendet wird, um mehrere Farbblöcke von einem Farbblock zu unterscheiden.)\ Eine Liste ähnelt einem Array in der C-Sprache. Die Blobs-Objekte sind Farbblöcke.
blobs = img.find_blobs([red])
Blobs sind viele Farbblöcke.
Sie können eine for-Schleife verwenden, um alle Farbblöcke zu durchsuchen.
for blob in blobs:
print(blob.cx())
Informationen zur Verwendung von for-Schleifen finden Sie unter Python-Hintergrundwissen
Blob-Farbblockobjekt
Blob verfügt über mehrere Methoden:
blob.rect() gibt den äußeren Rahmen dieses Farbblocks zurück – ein rechteckiges Tupel (x, y, w, h), das direkt in image.draw_rectangle verwendet werden kann.
blob.x() gibt die x-Koordinate (int) des äußeren Rahmens des Farbblocks zurück, die auch über blob[0] erhalten werden kann.
blob.y() gibt die y-Koordinate (int) des äußeren Rahmens des Farbblocks zurück, die auch über blob[1] erhalten werden kann.
blob.w() gibt die Breite w (int) des äußeren Rahmens des Farbblocks zurück, die auch über blob[2] erhalten werden kann.
blob.h() gibt die Höhe h (int) des äußeren Rahmens des Farbblocks zurück, die auch über blob[3] ermittelt werden kann.
blob.pixels() gibt die Anzahl der Pixel des Farbblocks (int) zurück, die auch über blob[4] ermittelt werden kann.
blob.cx() gibt die mittlere x-Koordinate (int) des äußeren Rahmens des Farbblocks zurück, die auch über blob[5] erhalten werden kann.
blob.cy() gibt die zentrale Y-Koordinate (int) des äußeren Rahmens des Farbblocks zurück, die auch über blob[6] erhalten werden kann.
blob.rotation() gibt den Rotationswinkel des Farbblocks im Bogenmaß (Float) zurück. Wenn der Farbblock einem Bleistift ähnelt, liegt dieser Wert bei 0~180°. Wenn das Farbfeld ein Kreis ist, ist dieser Wert nutzlos. Wenn der Farbblock überhaupt keine Symmetrie aufweist, erhalten Sie 0 ~ 360 °, was auch durch blob[7] erhalten werden kann.
blob.code() gibt eine 16-Bit-Zahl zurück, jedes Bit entspricht jedem Schwellenwert. Zum Beispiel:
Blobs = img.find_blobs([rot, blau, gelb], merge=True)
Wenn der Farbblock rot ist, lautet sein Code 0001, und wenn er blau ist, lautet sein Code 0010. Hinweis: Ein Blob kann zusammengeführt werden. Wenn es sich um einen roten und einen blauen Blob handelt, ist der Blob 0011. Mit dieser Funktion können Farbcodes gefunden werden. Es kann auch über blob[8] abgerufen werden.
blob.count() Wenn merge=True, werden mehrere Blobs zu einem Blob zusammengeführt und diese Funktion gibt diese Zahl zurück. Bei merge=False ist der Rückgabewert immer 1. Es kann auch über blob[9] abgerufen werden.
blob.area() gibt die Fläche des äußeren Felds des Farbblocks zurück. Sollte gleich (w * h) sein
blob.density() gibt die Dichte des Farbkleckses zurück. Dies entspricht der Anzahl der Pixel im Patch geteilt durch die Fläche des Begrenzungsrahmens. Wenn die Dichte niedrig ist, ist das Ziel nicht sehr gut erfasst.\ Um beispielsweise einen roten Kreis zu identifizieren, ist der zurückgegebene blob.pixels() die Anzahl der Pixel des Zielkreises und blob.area() die Fläche des umschriebenen Quadrats des Kreises.