Locate Circular Arc

In diesem Beispiel werden mit Hilfe der Funktion F_VN_LocateCircularArc Kreissegmente lokalisiert und vermessen. Als Ergebnis liefert diese Funktion eine TcVnCircularArc-Struktur zurück, die den Mittelpunkt, Radius und die begrenzenden Winkel enthält. Falls vollständige Kreise vermessen werden sollen, verwenden Sie stattdessen die Funktion F_VN_LocateEllipse.

Die Startposition der Suche sollte in etwa dem erwarteten Kreismittelpunkt des Kreissegments entsprechen, der in den zugehörigen Beispielbildern bei 400, 300 liegt.

Um zu zeigen, dass hier eine ungefähre Position ausreicht, wurde der entsprechende Parameter aCenter im Beispiel auf 420, 310 gesetzt. Es ist also möglich, kleine Positionsänderungen der zu untersuchenden Objekte im Bild zu kompensieren.

Da der tatsächliche Radius in den Beispielbildern bei etwa 200 Pixeln liegt und der Startpunkt absichtlich ungenau gewählt ist, wurde der Suchradius fRadius auf 270 festgelegt. Im konkreten Beispiel hätten auch etwa 230 Pixel ausgereicht, jedoch ist es in der Praxis immer gut, noch einen zusätzlichen Sicherheitspuffer zu haben, z. B. falls die Position des Objekts doch mal stärker abweicht als erwartet.

Für die Beispielbilder muss die Suchrichtung so gewählt werden, dass die Objekte in allen Bildern korrekt gefunden werden. Eine gute Richtung wäre unten links, also etwa 2.356 rad (135°). Um zu zeigen, dass diese Richtung wiederum nicht genau stimmen muss, wurde fDirection im Beispiel auf 2.1 rad (120.3°) gesetzt.

Des Weiteren muss noch definiert werden, dass ausgehend vom Startpunkt ein Übergang von hell nach dunkel gesucht wird. Zudem muss der minimale Kontrast spezifiziert werden, ab welchem die Funktion einen Intensitätsunterschied zwischen benachbarten Pixeln als Kante erkennt.

Für den Fall, dass die erläuterten Parameter nicht ausreichen um gute Ergebnisse zu erzielen, bietet die Experten-Funktion F_VN_LocateCircularArcExp eine Reihe weiterer Parameter, die in diesem Beispiel jedoch nicht betrachtet werden.

Variablen

hr               : HRESULT;

ipImageIn        : ITcVnImage;
ipImageInDisp    : ITcVnDisplayableImage;
ipImageRes       : ITcVnImage;
ipImageResDisp   : ITcVnDisplayableImage;

// result
stArc            : TcVnCircularArc;


// input parameters (to specify where to start searching for the circular arc)
aCenter
          : TcVnPoint2_REAL := [420, 310];
fRadius
          : REAL := 270;
fDirection
       : LREAL := 2.1;

// drawing
aColor           : TcVnVector4_LREAL := [0, 175, 0];
sText            : STRING(255);

Code

hr := F_VN_LocateCircularArc(
                    ipSrcImage         :=   ipImageIn,
                    stCircularArc      :=   stArc,
                    aCenterPoint       :=   aCenter,
                    fSearchRadius      :=   fRadius,
                    fArcDirectionRad   :=   fDirection,
                    eEdgeDirection     :=   TCVN_ED_LIGHT_TO_DARK,
                    fMinStrength       :=   100,
                    hrPrev             :=   hr);

// Draw result for visualization
hr := F_VN_ConvertColorSpace(ipImageIn, ipImageRes, TCVN_CST_GRAY_TO_RGB, hr);
hr := F_VN_DrawCircularArc(stArc, ipImageRes, aColor, 2, hr);
sText := CONCAT(CONCAT(CONCAT('Center ', REAL_TO_STRING(stArc.aCenter[0])), ', '), REAL_TO_STRING(stArc.aCenter[1]));
hr := F_VN_PutText(sText, ipImageRes, 420, 25, TCVN_FT_HERSHEY_SIMPLEX, 0.7, aColor, hr);
sText := CONCAT('Radius ', REAL_TO_STRING(stArc.fRadius));
hr := F_VN_PutText(sText, ipImageRes, 420, 50, TCVN_FT_HERSHEY_SIMPLEX, 0.7, aColor, hr);
sText := CONCAT('Angle start ', REAL_TO_STRING(stArc.fStartAngle * 180 / LREAL_TO_REAL(PI)));
hr := F_VN_PutText(sText, ipImageRes, 420, 75, TCVN_FT_HERSHEY_SIMPLEX, 0.7, aColor, hr);
sText := CONCAT('Angle end ', REAL_TO_STRING(stArc.fEndAngle * 180 / LREAL_TO_REAL(PI)));
hr := F_VN_PutText(sText, ipImageRes, 420, 100, TCVN_FT_HERSHEY_SIMPLEX, 0.7, aColor, hr);

// Display source and result image
hr := F_VN_TransformIntoDisplayableImage(ipImageIn, ipImageInDisp, S_OK);
hr := F_VN_TransformIntoDisplayableImage(ipImageRes, ipImageResDisp, S_OK);

Ergebnisse

Zur Visualisierung wird das gefundene Kreissegment mit Hilfe der Funktion F_VN_DrawCircularArc in das Ergebnisbild eingezeichnet und zusätzlich noch die zugrundeliegenden Zahlenwerte als Text dargestellt.

Locate Circular Arc 1:
LocateCircularArc_3QuarterCircle_Result
Locate Circular Arc 2:
LocateCircularArc_HalfCircle_Result
Locate Circular Arc 3:
LocateCircularArc_QuarterCircle_Result

Ähnliche Beispiele