find_marks_and_poseT_find_marks_and_poseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose (Operator)

Name

find_marks_and_poseT_find_marks_and_poseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose — Extrahieren der rechteckig angeordneten 2D-Kalibriermarken aus dem Bild und Bestimmen der Startwerte für die externen Kameraparameter.

Signatur

find_marks_and_pose(Image, CalPlateRegion : : CalPlateDescr, StartCamParam, StartThresh, DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks : RCoord, CCoord, StartPose)

Herror T_find_marks_and_pose(const Hobject Image, const Hobject CalPlateRegion, const Htuple CalPlateDescr, const Htuple StartCamParam, const Htuple StartThresh, const Htuple DeltaThresh, const Htuple MinThresh, const Htuple Alpha, const Htuple MinContLength, const Htuple MaxDiamMarks, Htuple* RCoord, Htuple* CCoord, Htuple* StartPose)

void FindMarksAndPose(const HObject& Image, const HObject& CalPlateRegion, const HTuple& CalPlateDescr, const HTuple& StartCamParam, const HTuple& StartThresh, const HTuple& DeltaThresh, const HTuple& MinThresh, const HTuple& Alpha, const HTuple& MinContLength, const HTuple& MaxDiamMarks, HTuple* RCoord, HTuple* CCoord, HTuple* StartPose)

HTuple HImage::FindMarksAndPose(const HRegion& CalPlateRegion, const HString& CalPlateDescr, const HCamPar& StartCamParam, Hlong StartThresh, Hlong DeltaThresh, Hlong MinThresh, double Alpha, double MinContLength, double MaxDiamMarks, HTuple* CCoord, HPose* StartPose) const

HTuple HImage::FindMarksAndPose(const HRegion& CalPlateRegion, const char* CalPlateDescr, const HCamPar& StartCamParam, Hlong StartThresh, Hlong DeltaThresh, Hlong MinThresh, double Alpha, double MinContLength, double MaxDiamMarks, HTuple* CCoord, HPose* StartPose) const

HTuple HImage::FindMarksAndPose(const HRegion& CalPlateRegion, const wchar_t* CalPlateDescr, const HCamPar& StartCamParam, Hlong StartThresh, Hlong DeltaThresh, Hlong MinThresh, double Alpha, double MinContLength, double MaxDiamMarks, HTuple* CCoord, HPose* StartPose) const   ( Nur Windows)

HTuple HCamPar::FindMarksAndPose(const HImage& Image, const HRegion& CalPlateRegion, const HString& CalPlateDescr, Hlong StartThresh, Hlong DeltaThresh, Hlong MinThresh, double Alpha, double MinContLength, double MaxDiamMarks, HTuple* CCoord, HPose* StartPose) const

HTuple HCamPar::FindMarksAndPose(const HImage& Image, const HRegion& CalPlateRegion, const char* CalPlateDescr, Hlong StartThresh, Hlong DeltaThresh, Hlong MinThresh, double Alpha, double MinContLength, double MaxDiamMarks, HTuple* CCoord, HPose* StartPose) const

HTuple HCamPar::FindMarksAndPose(const HImage& Image, const HRegion& CalPlateRegion, const wchar_t* CalPlateDescr, Hlong StartThresh, Hlong DeltaThresh, Hlong MinThresh, double Alpha, double MinContLength, double MaxDiamMarks, HTuple* CCoord, HPose* StartPose) const   ( Nur Windows)

HTuple HPose::FindMarksAndPose(const HImage& Image, const HRegion& CalPlateRegion, const HString& CalPlateDescr, const HCamPar& StartCamParam, Hlong StartThresh, Hlong DeltaThresh, Hlong MinThresh, double Alpha, double MinContLength, double MaxDiamMarks, HTuple* CCoord)

HTuple HPose::FindMarksAndPose(const HImage& Image, const HRegion& CalPlateRegion, const char* CalPlateDescr, const HCamPar& StartCamParam, Hlong StartThresh, Hlong DeltaThresh, Hlong MinThresh, double Alpha, double MinContLength, double MaxDiamMarks, HTuple* CCoord)

HTuple HPose::FindMarksAndPose(const HImage& Image, const HRegion& CalPlateRegion, const wchar_t* CalPlateDescr, const HCamPar& StartCamParam, Hlong StartThresh, Hlong DeltaThresh, Hlong MinThresh, double Alpha, double MinContLength, double MaxDiamMarks, HTuple* CCoord)   ( Nur Windows)

static void HOperatorSet.FindMarksAndPose(HObject image, HObject calPlateRegion, HTuple calPlateDescr, HTuple startCamParam, HTuple startThresh, HTuple deltaThresh, HTuple minThresh, HTuple alpha, HTuple minContLength, HTuple maxDiamMarks, out HTuple RCoord, out HTuple CCoord, out HTuple startPose)

HTuple HImage.FindMarksAndPose(HRegion calPlateRegion, string calPlateDescr, HCamPar startCamParam, int startThresh, int deltaThresh, int minThresh, double alpha, double minContLength, double maxDiamMarks, out HTuple CCoord, out HPose startPose)

HTuple HCamPar.FindMarksAndPose(HImage image, HRegion calPlateRegion, string calPlateDescr, int startThresh, int deltaThresh, int minThresh, double alpha, double minContLength, double maxDiamMarks, out HTuple CCoord, out HPose startPose)

HTuple HPose.FindMarksAndPose(HImage image, HRegion calPlateRegion, string calPlateDescr, HCamPar startCamParam, int startThresh, int deltaThresh, int minThresh, double alpha, double minContLength, double maxDiamMarks, out HTuple CCoord)

def find_marks_and_pose(image: HObject, cal_plate_region: HObject, cal_plate_descr: str, start_cam_param: Sequence[Union[int, float, str]], start_thresh: int, delta_thresh: int, min_thresh: int, alpha: float, min_cont_length: float, max_diam_marks: float) -> Tuple[Sequence[float], Sequence[float], Sequence[Union[float, int]]]

Beschreibung

find_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose dient zur Berechnung der Eingabedaten für eine nachfolgende Kalibrierung mit einer Kalibrierplatte mit rechteckiger Markenanordnung (vgl. Kalibrierung oder camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationcamera_calibration): Zum einen werden die 2D-Mittelpunkte [RCoordRCoordRCoordRCoordrcoord,CCoordCCoordCCoordCCoordccoord] der Kalibrierkörpermarken innerhalb der Region CalPlateRegionCalPlateRegionCalPlateRegioncalPlateRegioncal_plate_region im Bild ImageImageImageimageimage extrahiert und geordnet. Außerdem wird eine grobe Schätzung für die externen Kameraparameter (StartPoseStartPoseStartPosestartPosestart_pose) berechnet, d.h. für die 3D-Lage (= Position und Orientierung, Pose) des Kalibrierkörpers im Kamerakoordinatensystem (siehe create_posecreate_poseCreatePoseCreatePosecreate_pose für Information zu 3D-Lagen).

Innerhalb der Region CalPlateRegionCalPlateRegionCalPlateRegioncalPlateRegioncal_plate_region, die beispielsweise von dem Operator find_caltabfind_caltabFindCaltabFindCaltabfind_caltab detektiert wurde, im Eingabebild ImageImageImageimageimage wird ein Kantenoperator angewendet, vgl. Operator edges_imageedges_imageEdgesImageEdgesImageedges_image, Modus 'lanser2'. Der Filterparameter für diese Kantendetektion ist über Parameter AlphaAlphaAlphaalphaalpha einstellbar. Um eine stärkere Glättung zu erreichen, muss ein kleinerer Wert für AlphaAlphaAlphaalphaalpha verwendet werden. Im Kantenbild werden geschlossene Konturen gesucht, deren Anzahl gerade derjenigen aus der Kalibrierkörperbeschreibungsdatei CalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr entspricht und die ein ellipsenförmiges Aussehen besitzen. Konturen, die kürzer als MinContLengthMinContLengthMinContLengthminContLengthmin_cont_length sind, werden dabei verworfen, ebenso Konturen, die eine Bildregion mit einem Durchmesser größer als MaxDiamMarksMaxDiamMarksMaxDiamMarksmaxDiamMarksmax_diam_marks umschließen (also z.B. die Umrandung des Kalibrierkörpers selbst). Zur Kontursuche im Kantenbild wird ein Schwellenwertoperator angewandt, der die hellen Bereiche im Amplitudenbild des Kantenoperators segmentiert. Zunächst wird der Schwellenwert auf den Wert StartThreshStartThreshStartThreshstartThreshstart_thresh gesetzt. Schlägt die Suche nach den Konturen bzw. die nachfolgende Schätzung der Kameralage fehl, wird der Schwellenwert sukzessive um DeltaThreshDeltaThreshDeltaThreshdeltaThreshdelta_thresh bis minimal auf den Wert MinThreshMinThreshMinThreshminThreshmin_thresh erniedrigt.

Jede der gefundenen Konturen wird subpixelgenau verfeinert (vgl. edges_sub_pixedges_sub_pixEdgesSubPixEdgesSubPixedges_sub_pix) und anschließend vermöge eines Ausgleichsverfahrens durch eine Ellipse approximiert. Die Mittelpunkte dieser Ellipsen stellen eine gute Näherung der gesuchten 2D-Bildkoordinaten [RCoordRCoordRCoordRCoordrcoord,CCoordCCoordCCoordCCoordccoord] der Kalibrierkörpermarkenmittelpunkte dar. Die Reihenfolge der einzelnen Werte innerhalb dieser beiden Tupel erfolgt zeilenweise von links oben nach rechts unten im Bild und muss unbedingt mit der Reihenfolge der 3D-Koordinaten der Marken in der Kalibrierkörperbeschreibungsdatei CalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr übereinstimmen, da so die Korrespondenzen zwischen den extrahierten Bild- und den bekannten Modellmarken (gegeben durch caltab_pointscaltab_pointsCaltabPointsCaltabPointscaltab_points) festgelegt werden! Wenn in einer Ecke der Platte eine dreieckige Marke durch die Beschreibungsdatei CalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr definiert ist (siehe gen_caltabgen_caltabGenCaltabGenCaltabgen_caltab), wird zusätzlich die Orientierung der Platte ermittelt. Die Bild-Modell-Zuordnung der Punkte beginnt dann mit der Eckmarke des Modells im negativen Quadranten (links oben) und wird zeilenweise von links oben nach rechts unten fortgesetzt.

Aus den Ellipsenparametern der einzelnen Marken wird abschließend noch eine grobe Schätzung für die externen Kameraparameter berechnet. Dazu werden die aufgestellten Korrespondenzen zwischen den extrahierten Bild- und den bekannten Modellmarken verwendet, die sich durch die Reihenfolge der Markenpunkte in [RCoordRCoordRCoordRCoordrcoord,CCoordCCoordCCoordCCoordccoord] bzw. in der Datei CalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr ergeben. Die Schätzung StartPoseStartPoseStartPosestartPosestart_pose beschreibt die Lage (Pose) des Kalibrierkörpers im Kamerakoordinatensystem, wie sie als Startwert für die Kamerakalibrierung durch den Operator camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationcamera_calibration benötigt wird.

Ausführungsinformationen

Parameter

ImageImageImageimageimage (input_object)  singlechannelimage objectHImageHObjectHObjectHobject (byte / uint2)

Eingabebild.

CalPlateRegionCalPlateRegionCalPlateRegioncalPlateRegioncal_plate_region (input_object)  region objectHRegionHObjectHObjectHobject

Kalibrierkörperregion.

CalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr (input_control)  filename.read HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Dateiname der Kalibrierkörperbeschreibung.

Default: 'caltab_100.descr' "caltab_100.descr" "caltab_100.descr" "caltab_100.descr" "caltab_100.descr"

Werteliste: 'caltab_100mm.descr'"caltab_100mm.descr""caltab_100mm.descr""caltab_100mm.descr""caltab_100mm.descr", 'caltab_10mm.descr'"caltab_10mm.descr""caltab_10mm.descr""caltab_10mm.descr""caltab_10mm.descr", 'caltab_200mm.descr'"caltab_200mm.descr""caltab_200mm.descr""caltab_200mm.descr""caltab_200mm.descr", 'caltab_2500um.descr'"caltab_2500um.descr""caltab_2500um.descr""caltab_2500um.descr""caltab_2500um.descr", 'caltab_30mm.descr'"caltab_30mm.descr""caltab_30mm.descr""caltab_30mm.descr""caltab_30mm.descr", 'caltab_650um.descr'"caltab_650um.descr""caltab_650um.descr""caltab_650um.descr""caltab_650um.descr", 'caltab_6mm.descr'"caltab_6mm.descr""caltab_6mm.descr""caltab_6mm.descr""caltab_6mm.descr", 'caltab_800mm.descr'"caltab_800mm.descr""caltab_800mm.descr""caltab_800mm.descr""caltab_800mm.descr", 'caltab_big.descr'"caltab_big.descr""caltab_big.descr""caltab_big.descr""caltab_big.descr", 'caltab_small.descr'"caltab_small.descr""caltab_small.descr""caltab_small.descr""caltab_small.descr"

Dateiendung: .descr

StartCamParamStartCamParamStartCamParamstartCamParamstart_cam_param (input_control)  campar HCamPar, HTupleSequence[Union[int, float, str]]HTupleHtuple (real / integer / string) (double / int / long / string) (double / Hlong / HString) (double / Hlong / char*)

Startwerte für die internen Kameraparameter.

StartThreshStartThreshStartThreshstartThreshstart_thresh (input_control)  number HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Startschwellenwert zur Konturdetektion.

Default: 128

Wertevorschläge: 80, 96, 112, 128, 144, 160

Restriktion: StartThresh > 0

DeltaThreshDeltaThreshDeltaThreshdeltaThreshdelta_thresh (input_control)  number HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Schleifenwert zur Verkleinerung von StartThreshStartThreshStartThreshstartThreshstart_thresh.

Default: 10

Wertevorschläge: 6, 8, 10, 12, 14, 16, 18, 20, 22

Restriktion: DeltaThresh > 0

MinThreshMinThreshMinThreshminThreshmin_thresh (input_control)  number HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Minimaler Schwellenwert zur Konturdetektion.

Default: 18

Wertevorschläge: 8, 10, 12, 14, 16, 18, 20, 22

Restriktion: MinThresh > 0

AlphaAlphaAlphaalphaalpha (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Filterparameter zur Konturdetektion, vgl. edges_imageedges_imageEdgesImageEdgesImageedges_image.

Default: 0.9

Wertevorschläge: 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1

Wertebereich: 0.2 ≤ Alpha Alpha Alpha alpha alpha ≤ 2.0

Restriktion: Alpha > 0.0

MinContLengthMinContLengthMinContLengthminContLengthmin_cont_length (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Minimale Länge der Markenkonturen.

Default: 15.0

Wertevorschläge: 10.0, 15.0, 20.0, 30.0, 40.0, 100.0

Restriktion: MinContLength > 0.0

MaxDiamMarksMaxDiamMarksMaxDiamMarksmaxDiamMarksmax_diam_marks (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Maximal erwarteter Markendurchmesser.

Default: 100.0

Wertevorschläge: 50.0, 100.0, 150.0, 200.0, 300.0

Restriktion: MaxDiamMarks > 0.0

RCoordRCoordRCoordRCoordrcoord (output_control)  real-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Tupel aller detektierten Zeilen-Koordinaten (in Pixel).

CCoordCCoordCCoordCCoordccoord (output_control)  real-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Tupel aller detektierten Spalten-Koordinaten (in Pixel).

StartPoseStartPoseStartPosestartPosestart_pose (output_control)  pose HPose, HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Schätzung für die externen Kameraparameter.

Parameteranzahl: 7

Beispiel (HDevelop)

* Read calibration image.
read_image(Image, 'calib/calib_distorted_01')
* Find calibration pattern.
find_caltab(Image,CalPlate, 'caltab_100mm.descr', 3, 112, 5)
* Find calibration marks and start pose.
find_marks_and_pose(Image, CalPlate, 'caltab_100mm.descr' , \
                    ['area_scan_division', 0.008, 0.0, \
                     0.000011, 0.000011, 384, 288, 640, 512], \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord, CCoord, StartPose)

Beispiel (HDevelop)

* Read calibration image.
read_image(Image, 'calib/calib_distorted_01')
* Find calibration pattern.
find_caltab(Image,CalPlate, 'caltab_100mm.descr', 3, 112, 5)
* Find calibration marks and start pose.
find_marks_and_pose(Image, CalPlate, 'caltab_100mm.descr' , \
                    ['area_scan_division', 0.008, 0.0, \
                     0.000011, 0.000011, 384, 288, 640, 512], \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord, CCoord, StartPose)

Beispiel (C++)

HTuple StartCamPar, RCoord, CCoord, StartPose;
// Read calibration image.
HImage Image("calib/calib_distorted_01");
// Find calibration pattern.
HRegion CalPlate = Image.FindCaltab("caltab_100mm.descr", 3, 112, 5);
// Read internal camera parameters from file.
read_cam_par("campar.dat", &StartCamPar);
// Find calibration marks and start pose.
RCoord = Image.FindMarksAndPose(CalPlate, "caltab_100mm.descr", StartCamPar,
                                128, 10, 18, 0.9, 15.0, 100.0,
                                &RCoord, &CCoord, &StartPose);

Beispiel (HDevelop)

* Read calibration image.
read_image(Image, 'calib/calib_distorted_01')
* Find calibration pattern.
find_caltab(Image,CalPlate, 'caltab_100mm.descr', 3, 112, 5)
* Find calibration marks and start pose.
find_marks_and_pose(Image, CalPlate, 'caltab_100mm.descr' , \
                    ['area_scan_division', 0.008, 0.0, \
                     0.000011, 0.000011, 384, 288, 640, 512], \
                    128, 10, 18, 0.9, 15.0, 100.0, RCoord, CCoord, StartPose)

Ergebnis

Sind die Parameterwerte korrekt und konnte eine Schätzung für die externen Kameraparameter bestimmt werden, dann liefert find_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose den Wert 2 ( H_MSG_TRUE) . Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

find_caltabfind_caltabFindCaltabFindCaltabfind_caltab

Nachfolger

camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationcamera_calibration

Siehe auch

find_caltabfind_caltabFindCaltabFindCaltabfind_caltab, camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationcamera_calibration, disp_caltabdisp_caltabDispCaltabDispCaltabdisp_caltab, sim_caltabsim_caltabSimCaltabSimCaltabsim_caltab, read_cam_parread_cam_parReadCamParReadCamParread_cam_par, read_poseread_poseReadPoseReadPoseread_pose, create_posecreate_poseCreatePoseCreatePosecreate_pose, pose_to_hom_mat3dpose_to_hom_mat3dPoseToHomMat3dPoseToHomMat3dpose_to_hom_mat3d, caltab_pointscaltab_pointsCaltabPointsCaltabPointscaltab_points, gen_caltabgen_caltabGenCaltabGenCaltabgen_caltab, edges_sub_pixedges_sub_pixEdgesSubPixEdgesSubPixedges_sub_pix, edges_imageedges_imageEdgesImageEdgesImageedges_image

Modul

Foundation