get_circle_poseT_get_circle_poseGetCirclePoseGetCirclePoseget_circle_pose (Operator)
Name
get_circle_poseT_get_circle_poseGetCirclePoseGetCirclePoseget_circle_pose — Bestimmen der 3D-Lage (Pose) eines Kreises aus seiner perspektivischen
Projektion in 2D.
Signatur
void GetCirclePose(const HObject& Contour, const HTuple& CameraParam, const HTuple& Radius, const HTuple& OutputType, HTuple* Pose1, HTuple* Pose2)
HTuple HXLD::GetCirclePose(const HCamPar& CameraParam, const HTuple& Radius, const HString& OutputType, HTuple* Pose2) const
HTuple HXLD::GetCirclePose(const HCamPar& CameraParam, double Radius, const HString& OutputType, HTuple* Pose2) const
HTuple HXLD::GetCirclePose(const HCamPar& CameraParam, double Radius, const char* OutputType, HTuple* Pose2) const
HTuple HXLD::GetCirclePose(const HCamPar& CameraParam, double Radius, const wchar_t* OutputType, HTuple* Pose2) const
(Nur Windows)
HTuple HCamPar::GetCirclePose(const HXLD& Contour, const HTuple& Radius, const HString& OutputType, HTuple* Pose2) const
HTuple HCamPar::GetCirclePose(const HXLD& Contour, double Radius, const HString& OutputType, HTuple* Pose2) const
HTuple HCamPar::GetCirclePose(const HXLD& Contour, double Radius, const char* OutputType, HTuple* Pose2) const
HTuple HCamPar::GetCirclePose(const HXLD& Contour, double Radius, const wchar_t* OutputType, HTuple* Pose2) const
(Nur Windows)
static void HOperatorSet.GetCirclePose(HObject contour, HTuple cameraParam, HTuple radius, HTuple outputType, out HTuple pose1, out HTuple pose2)
HTuple HXLD.GetCirclePose(HCamPar cameraParam, HTuple radius, string outputType, out HTuple pose2)
HTuple HXLD.GetCirclePose(HCamPar cameraParam, double radius, string outputType, out HTuple pose2)
HTuple HCamPar.GetCirclePose(HXLD contour, HTuple radius, string outputType, out HTuple pose2)
HTuple HCamPar.GetCirclePose(HXLD contour, double radius, string outputType, out HTuple pose2)
def get_circle_pose(contour: HObject, camera_param: Sequence[Union[int, float, str]], radius: MaybeSequence[float], output_type: str) -> Tuple[Sequence[Union[float, int]], Sequence[Union[float, int]]]
Beschreibung
Jede Ellipse im Bild kann als die perspektivische Projektion eines Kreises
interpretiert werden. Tatsächlich existieren für einen vorgegebenen Radius
des Kreises zwei unterschiedlich orientierte Kreise im Raum,
die dieselbe Projektion zur Folge haben.
get_circle_poseget_circle_poseGetCirclePoseGetCirclePoseGetCirclePoseget_circle_pose bestimmt die 3D-Positionen und -Orientierungen
dieser beiden Kreise. Zuerst wird jede ContourContourContourContourcontourcontour durch eine
Ellipse approximiert. Dann werden, basierend auf den internen
Kameraparametern (CameraParamCameraParamCameraParamCameraParamcameraParamcamera_param) und dem Radius des Kreises
in 3D (RadiusRadiusRadiusRadiusradiusradius), die 3D-Positionen und -Orientierungen
(Pose1Pose1Pose1Pose1pose1pose_1,Pose2Pose2Pose2Pose2pose2pose_2) in Kamerakoordinaten bestimmt.
In Abhängigkeit vom Wert des Parameters OutputTypeOutputTypeOutputTypeOutputTypeoutputTypeoutput_type werden
Position und Orientierung als 3D-Lage (Pose)
(OutputTypeOutputTypeOutputTypeOutputTypeoutputTypeoutput_type = 'pose'"pose""pose""pose""pose""pose") oder in Form des Mittelpunktes
des Kreises und des Normalenvektors der Ebene, in der der Kreis liegt
(OutputTypeOutputTypeOutputTypeOutputTypeoutputTypeoutput_type = 'center_normal'"center_normal""center_normal""center_normal""center_normal""center_normal"), zurückgegeben.
Im ersteren Fall wird der Winkel für die Rotation um die z-Achse
auf Null gesetzt, da er nicht bestimmt werden kann.
Im letzteren Fall enthalten die ersten drei Elemente der
Ausgabeparameter Pose1Pose1Pose1Pose1pose1pose_1 und Pose2Pose2Pose2Pose2pose2pose_2 jeweils die
Kamerakoordinaten des Mittelpunktes. Die folgenden drei Elemente
enthalten den Normalenvektor. Der Normalenvektor ist normalisiert
und zeigt auf die Seite der Ebene, die das Projektionszentrum, also
den Ursprung des Kamerakoordinatensystems, nicht enthält.
Ist der Parameter OutputTypeOutputTypeOutputTypeOutputTypeoutputTypeoutput_type auf den Wert
'center_normal'"center_normal""center_normal""center_normal""center_normal""center_normal" gesetzt, enthalten die Ausgabeparameter
Pose1Pose1Pose1Pose1pose1pose_1 und Pose2Pose2Pose2Pose2pose2pose_2 nur jeweils sechs Elemente, die die
Position und die Orientierung der Kreise beschreiben. Ist hingegen
OutputTypeOutputTypeOutputTypeOutputTypeoutputTypeoutput_type = 'pose'"pose""pose""pose""pose""pose", enthalten die Ausgabeparameter
Pose1Pose1Pose1Pose1pose1pose_1 und Pose2Pose2Pose2Pose2pose2pose_2 jeweils die sieben Elemente der Pose.
Wird mehr als eine Kontur in ContourContourContourContourcontourcontour übergeben, muss
in RadiusRadiusRadiusRadiusradiusradius entweder ein Tupel übergeben werden, das für
jede Kontur einen Wert enthält, oder RadiusRadiusRadiusRadiusradiusradius enthält nur
einen Wert, der dann für alle Konturen verwendet wird.
Die Ausgabeparameter Pose1Pose1Pose1Pose1pose1pose_1 und Pose2Pose2Pose2Pose2pose2pose_2 enthalten die
Posen bzw. die Positionen und Orientierungen hintereinander, d.h.
Pose1Pose1Pose1Pose1pose1pose_1 und Pose2Pose2Pose2Pose2pose2pose_2 enthalten zuerst die Pose bzw. die
Position und den Normalenvektor für die erste Kontur, dann die
Werte für die zweite Kontur, usw.
Achtung
Die Genauigkeit der Posen hängt stark von der Genauigkeit der extrahierten
Konturen ab.
Die Extraktion von gekrümmten Kanten mit relativ großen Filtermasken
hat zur Folge, dass die Kantenposition leicht verschoben wird.
Kantenextraktionsverfahren, die auf der ersten Ableitung der Bildfunktion
basieren (z.B. edges_sub_pixedges_sub_pixEdgesSubPixEdgesSubPixEdgesSubPixedges_sub_pix) verschieben die Kantenposition
in Richtung des Krümmungsmittelpunkts, d.h. extrahierte Ellipsen
werden geringfügig kleiner. Extraktionsverfahren, die auf der zweiten
Ableitung der Bildfunktion basieren (laplace_of_gausslaplace_of_gaussLaplaceOfGaussLaplaceOfGaussLaplaceOfGausslaplace_of_gauss
gefolgt von zero_crossing_sub_pixzero_crossing_sub_pixZeroCrossingSubPixZeroCrossingSubPixZeroCrossingSubPixzero_crossing_sub_pix), verschieben die Kantenposition
vom Krümmungsmittelpunkt weg, d.h. extrahierte Ellipsen werden
geringfügig größer.
Diese Effekte sind umso stärker, je stärker die Kante gekrümmt ist und
je größer die verwendete Filtermaske ist. Um hohe Genauigkeiten erzielen
zu können, sollten daher die Ellipsen im Bild groß sein und der
Filterparameter sollte so gewählt werden, dass kleine Filtermasken
verwendet werden (siehe info_edgesinfo_edgesInfoEdgesInfoEdgesInfoEdgesinfo_edges).
Ausführungsinformationen
- Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
- Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
- Wird ohne Parallelisierung verarbeitet.
Parameter
ContourContourContourContourcontourcontour (input_object) xld(-array) → objectHXLDHObjectHXLDHobject
Zu untersuchende Konturen.
CameraParamCameraParamCameraParamCameraParamcameraParamcamera_param (input_control) campar → HCamPar, HTupleSequence[Union[int, float, str]]HTupleHtuple (real / integer / string) (double / int / long / string) (double / Hlong / HString) (double / Hlong / char*)
Interne Kameraparameter.
RadiusRadiusRadiusRadiusradiusradius (input_control) number(-array) → HTupleMaybeSequence[float]HTupleHtuple (real) (double) (double) (double)
Radius des Kreises im Objektraum.
Parameteranzahl: Radius == Contour || Radius == 1
Restriktion: Radius > 0.0
OutputTypeOutputTypeOutputTypeOutputTypeoutputTypeoutput_type (input_control) string → HTuplestrHTupleHtuple (string) (string) (HString) (char*)
Typ der Rückgabewerte.
Defaultwert:
'pose'
"pose"
"pose"
"pose"
"pose"
"pose"
Werteliste: 'center_normal'"center_normal""center_normal""center_normal""center_normal""center_normal", 'pose'"pose""pose""pose""pose""pose"
Pose1Pose1Pose1Pose1pose1pose_1 (output_control) real-array → HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)
3D-Lage (Pose) des ersten Kreises.
Parameteranzahl: Pose1 == 7 * Contour || Pose1 == 6 * Contour
Pose2Pose2Pose2Pose2pose2pose_2 (output_control) real-array → HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)
3D-Lage (Pose) des zweiten Kreises.
Parameteranzahl: Pose2 == 7 * Contour || Pose2 == 6 * Contour
Ergebnis
Sind die Parameterwerte korrekt und konnte die Position des Kreises
bestimmt werden, dann liefert get_circle_poseget_circle_poseGetCirclePoseGetCirclePoseGetCirclePoseget_circle_pose den Wert 2 (H_MSG_TRUE).
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
Vorgänger
edges_sub_pixedges_sub_pixEdgesSubPixEdgesSubPixEdgesSubPixedges_sub_pix
Alternativen
find_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose,
camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration
Siehe auch
get_rectangle_poseget_rectangle_poseGetRectanglePoseGetRectanglePoseGetRectanglePoseget_rectangle_pose,
fit_ellipse_contour_xldfit_ellipse_contour_xldFitEllipseContourXldFitEllipseContourXldFitEllipseContourXldfit_ellipse_contour_xld
Modul
3D Metrology