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_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose
dient zur Berechnung der
Eingabedaten für eine nachfolgende Kalibrierung mit einer Kalibrierplatte mit
rechteckiger Markenanordnung (vgl.
Kalibrierung oder camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration
):
Zum einen werden die 2D-Mittelpunkte
[RCoordRCoordRCoordRCoordRCoordrcoord
,CCoordCCoordCCoordCCoordCCoordccoord
] der Kalibrierkörpermarken innerhalb der
Region CalPlateRegionCalPlateRegionCalPlateRegionCalPlateRegioncalPlateRegioncal_plate_region
im Bild ImageImageImageImageimageimage
extrahiert und
geordnet. Außerdem wird eine grobe Schätzung für die externen
Kameraparameter (StartPoseStartPoseStartPoseStartPosestartPosestart_pose
) berechnet,
d.h. für die 3D-Lage (= Position und Orientierung, Pose) des
Kalibrierkörpers im Kamerakoordinatensystem (siehe create_posecreate_poseCreatePoseCreatePoseCreatePosecreate_pose
für
Information zu 3D-Lagen).
Innerhalb der Region CalPlateRegionCalPlateRegionCalPlateRegionCalPlateRegioncalPlateRegioncal_plate_region
, die beispielsweise von
dem Operator find_caltabfind_caltabFindCaltabFindCaltabFindCaltabfind_caltab
detektiert wurde, im Eingabebild
ImageImageImageImageimageimage
wird ein Kantenoperator angewendet, vgl. Operator
edges_imageedges_imageEdgesImageEdgesImageEdgesImageedges_image
, Modus 'lanser2'. Der Filterparameter für diese
Kantendetektion ist über Parameter AlphaAlphaAlphaAlphaalphaalpha
einstellbar. Um
eine stärkere Glättung zu erreichen, muss ein kleinerer Wert für
AlphaAlphaAlphaAlphaalphaalpha
verwendet werden. Im Kantenbild werden geschlossene
Konturen gesucht, deren Anzahl gerade derjenigen aus der
Kalibrierkörperbeschreibungsdatei CalPlateDescrCalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr
entspricht und
die ein ellipsenförmiges Aussehen besitzen. Konturen, die kürzer als
MinContLengthMinContLengthMinContLengthMinContLengthminContLengthmin_cont_length
sind, werden dabei verworfen, ebenso Konturen,
die eine Bildregion mit einem Durchmesser größer als
MaxDiamMarksMaxDiamMarksMaxDiamMarksMaxDiamMarksmaxDiamMarksmax_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 StartThreshStartThreshStartThreshStartThreshstartThreshstart_thresh
gesetzt. Schlägt
die Suche nach den Konturen bzw. die nachfolgende Schätzung der
Kameralage fehl, wird der Schwellenwert sukzessive um DeltaThreshDeltaThreshDeltaThreshDeltaThreshdeltaThreshdelta_thresh
bis minimal auf den Wert MinThreshMinThreshMinThreshMinThreshminThreshmin_thresh
erniedrigt.
Jede der gefundenen Konturen wird subpixelgenau verfeinert
(vgl. edges_sub_pixedges_sub_pixEdgesSubPixEdgesSubPixEdgesSubPixedges_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 [RCoordRCoordRCoordRCoordRCoordrcoord
,CCoordCCoordCCoordCCoordCCoordccoord
]
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 CalPlateDescrCalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr
übereinstimmen, da so die Korrespondenzen zwischen den extrahierten
Bild- und den bekannten Modellmarken (gegeben durch caltab_pointscaltab_pointsCaltabPointsCaltabPointsCaltabPointscaltab_points
)
festgelegt werden! Wenn in einer Ecke der Platte eine dreieckige Marke
durch die Beschreibungsdatei CalPlateDescrCalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr
definiert ist
(siehe gen_caltabgen_caltabGenCaltabGenCaltabGenCaltabgen_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 [RCoordRCoordRCoordRCoordRCoordrcoord
,CCoordCCoordCCoordCCoordCCoordccoord
] bzw.
in der Datei CalPlateDescrCalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr
ergeben. Die Schätzung
StartPoseStartPoseStartPoseStartPosestartPosestart_pose
beschreibt die Lage (Pose) des Kalibrierkörpers im
Kamerakoordinatensystem,
wie sie als Startwert für die Kamerakalibrierung durch
den Operator camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration
benötigt wird.
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
ImageImageImageImageimageimage
(input_object) singlechannelimage →
objectHImageHObjectHImageHobject (byte / uint2)
Eingabebild.
CalPlateRegionCalPlateRegionCalPlateRegionCalPlateRegioncalPlateRegioncal_plate_region
(input_object) region →
objectHRegionHObjectHRegionHobject
Kalibrierkörperregion.
CalPlateDescrCalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr
(input_control) filename.read →
HTuplestrHTupleHtuple (string) (string) (HString) (char*)
Dateiname der Kalibrierkörperbeschreibung.
Defaultwert:
'caltab_100.descr'
"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_100mm.descr", 'caltab_10mm.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_200mm.descr", 'caltab_2500um.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_30mm.descr", 'caltab_650um.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_6mm.descr", 'caltab_800mm.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_big.descr", 'caltab_small.descr'"caltab_small.descr""caltab_small.descr""caltab_small.descr""caltab_small.descr""caltab_small.descr"
Dateiendung: .descr
StartCamParamStartCamParamStartCamParamStartCamParamstartCamParamstart_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.
StartThreshStartThreshStartThreshStartThreshstartThreshstart_thresh
(input_control) number →
HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)
Startschwellenwert zur Konturdetektion.
Defaultwert: 128
Wertevorschläge: 80, 96, 112, 128, 144, 160
Restriktion: StartThresh > 0
MinThreshMinThreshMinThreshMinThreshminThreshmin_thresh
(input_control) number →
HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)
Minimaler Schwellenwert zur Konturdetektion.
Defaultwert: 18
Wertevorschläge: 8, 10, 12, 14, 16, 18, 20, 22
Restriktion: MinThresh > 0
AlphaAlphaAlphaAlphaalphaalpha
(input_control) real →
HTuplefloatHTupleHtuple (real) (double) (double) (double)
Filterparameter zur Konturdetektion, vgl.
edges_imageedges_imageEdgesImageEdgesImageEdgesImageedges_image
.
Defaultwert: 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
Typischer Wertebereich: 0.2
≤
Alpha
Alpha
Alpha
Alpha
alpha
alpha
≤
2.0
Restriktion: Alpha > 0.0
MinContLengthMinContLengthMinContLengthMinContLengthminContLengthmin_cont_length
(input_control) real →
HTuplefloatHTupleHtuple (real) (double) (double) (double)
Minimale Länge der Markenkonturen.
Defaultwert: 15.0
Wertevorschläge: 10.0, 15.0, 20.0, 30.0, 40.0, 100.0
Restriktion: MinContLength > 0.0
MaxDiamMarksMaxDiamMarksMaxDiamMarksMaxDiamMarksmaxDiamMarksmax_diam_marks
(input_control) real →
HTuplefloatHTupleHtuple (real) (double) (double) (double)
Maximal erwarteter Markendurchmesser.
Defaultwert: 100.0
Wertevorschläge: 50.0, 100.0, 150.0, 200.0, 300.0
Restriktion: MaxDiamMarks > 0.0
RCoordRCoordRCoordRCoordRCoordrcoord
(output_control) real-array →
HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)
Tupel aller detektierten Zeilen-Koordinaten (in Pixel).
CCoordCCoordCCoordCCoordCCoordccoord
(output_control) real-array →
HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)
Tupel aller detektierten Spalten-Koordinaten (in Pixel).
StartPoseStartPoseStartPoseStartPosestartPosestart_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)
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_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose
den Wert TRUE. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
Vorgänger
find_caltabfind_caltabFindCaltabFindCaltabFindCaltabfind_caltab
Nachfolger
camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration
Siehe auch
find_caltabfind_caltabFindCaltabFindCaltabFindCaltabfind_caltab
,
camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration
,
disp_caltabdisp_caltabDispCaltabDispCaltabDispCaltabdisp_caltab
,
sim_caltabsim_caltabSimCaltabSimCaltabSimCaltabsim_caltab
,
read_cam_parread_cam_parReadCamParReadCamParReadCamParread_cam_par
,
read_poseread_poseReadPoseReadPoseReadPoseread_pose
,
create_posecreate_poseCreatePoseCreatePoseCreatePosecreate_pose
,
pose_to_hom_mat3dpose_to_hom_mat3dPoseToHomMat3dPoseToHomMat3dPoseToHomMat3dpose_to_hom_mat3d
,
caltab_pointscaltab_pointsCaltabPointsCaltabPointsCaltabPointscaltab_points
,
gen_caltabgen_caltabGenCaltabGenCaltabGenCaltabgen_caltab
,
edges_sub_pixedges_sub_pixEdgesSubPixEdgesSubPixEdgesSubPixedges_sub_pix
,
edges_imageedges_imageEdgesImageEdgesImageEdgesImageedges_image
Modul
Foundation