find_caltabfind_caltabFindCaltabFindCaltabfind_caltab (Operator)
Name
find_caltabfind_caltabFindCaltabFindCaltabfind_caltab
— Segmentieren der Region einer Standard-Kalibrierplatte mit rechteckiger
Markenanordnung im Bild.
Signatur
Herror find_caltab(const Hobject Image, Hobject* CalPlate, const char* CalPlateDescr, const Hlong SizeGauss, const Hlong MarkThresh, const Hlong MinDiamMarks)
Herror T_find_caltab(const Hobject Image, Hobject* CalPlate, const Htuple CalPlateDescr, const Htuple SizeGauss, const Htuple MarkThresh, const Htuple MinDiamMarks)
void FindCaltab(const HObject& Image, HObject* CalPlate, const HTuple& CalPlateDescr, const HTuple& SizeGauss, const HTuple& MarkThresh, const HTuple& MinDiamMarks)
HRegion HImage::FindCaltab(const HString& CalPlateDescr, const HTuple& SizeGauss, const HTuple& MarkThresh, Hlong MinDiamMarks) const
HRegion HImage::FindCaltab(const HString& CalPlateDescr, Hlong SizeGauss, Hlong MarkThresh, Hlong MinDiamMarks) const
HRegion HImage::FindCaltab(const char* CalPlateDescr, Hlong SizeGauss, Hlong MarkThresh, Hlong MinDiamMarks) const
HRegion HImage::FindCaltab(const wchar_t* CalPlateDescr, Hlong SizeGauss, Hlong MarkThresh, Hlong MinDiamMarks) const
(Nur Windows)
static void HOperatorSet.FindCaltab(HObject image, out HObject calPlate, HTuple calPlateDescr, HTuple sizeGauss, HTuple markThresh, HTuple minDiamMarks)
HRegion HImage.FindCaltab(string calPlateDescr, HTuple sizeGauss, HTuple markThresh, int minDiamMarks)
HRegion HImage.FindCaltab(string calPlateDescr, int sizeGauss, int markThresh, int minDiamMarks)
Beschreibung
find_caltabfind_caltabFindCaltabFindCaltabFindCaltabfind_caltab
bestimmt die Region einer
Standard-Kalibrierplatte mit runden Marken im übergebenen Bild
ImageImageImageImageimageimage
. Die gesuchte Region muss einer Standard-Kalibrierplatte
mit rechteckiger Markenanordnung entsprechen, welche in der Datei
CalPlateDescrCalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr
spezifiziert ist.
Die segmentierte Region wird in CalPlateCalPlateCalPlateCalPlatecalPlatecal_plate
zurückgeliefert.
Der Operator bietet zwei Algorithmen an.
Wenn man jeweils einen passenden Integerwert im Parameter SizeGaussSizeGaussSizeGaussSizeGausssizeGausssize_gauss
,
MarkThreshMarkThreshMarkThreshMarkThreshmarkThreshmark_thresh
und MinDiamMarksMinDiamMarksMinDiamMarksMinDiamMarksminDiamMarksmin_diam_marks
übergibt, wird der
Standardalgorithmus aufgerufen. Wenn man eine Liste mit
Parameternamen und -werten in SizeGaussSizeGaussSizeGaussSizeGausssizeGausssize_gauss
bzw. MarkThreshMarkThreshMarkThreshMarkThreshmarkThreshmark_thresh
übergibt (oder auch nur zwei leere Tupel) wird der erweiterte
Algorithmus aufgerufen. In diesem Fall wird der Parameter
MinDiamMarksMinDiamMarksMinDiamMarksMinDiamMarksminDiamMarksmin_diam_marks
ignoriert.
Standardalgorithmus
Zunächst wird das Bild geglättet (vgl. gauss_imagegauss_imageGaussImageGaussImageGaussImagegauss_image
). Die Größe der
verwendeten Filtermaske wird dabei durch SizeGaussSizeGaussSizeGaussSizeGausssizeGausssize_gauss
eingestellt.
Anschließend wird ein Schwellenwertoperator (vgl. thresholdthresholdThresholdThresholdThresholdthreshold
)
mit minimalem Grauwert MarkThreshMarkThreshMarkThreshMarkThreshmarkThreshmark_thresh
angewandt. Unter den
extrahierten zusammenhängenden Regionen wird nun eine möglichst
konvexe Region mit annähernd korrekter Anzahl von Löchern
(entsprechend den dunklen Marken) gesucht. Um Rauschen zu
unterdrücken, werden kleine Löcher mit geringerem Durchmesser
als die erwartete Markengröße MinDiamMarksMinDiamMarksMinDiamMarksMinDiamMarksminDiamMarksmin_diam_marks
zuvor
eliminiert. Die Anzahl der Kalibrierkörpermarken wird der
Beschreibungsdatei CalPlateDescrCalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr
des Kalibrierkörpers
entnommen. Die komplette Erklärung dieser Datei ist bei der
Beschreibung von gen_caltabgen_caltabGenCaltabGenCaltabGenCaltabgen_caltab
zu finden.
Erweiterter Algorithmus
Zunächst wird eine Bildpyramide von ImageImageImageImageimageimage
erstellt. Beginnend
mit der höchsten Pyramidenebene werden runde Regionen anhand eines
dynamischen Schwellenwerts segmentiert. Anschließend werden sie abhängig von
ihrem gegenseitigen Abstand gruppiert. Falls die Anzahl der Kandidaten
für die Kalibrierkörpermarken in einer Gruppe die Soll-Anzahl genau
erreicht, wird die Suche unterbrochen. Der umschließende helle Bereich
wird segmentiert und als Treffer in CalPlateCalPlateCalPlateCalPlatecalPlatecal_plate
zurückgegeben.
Durch die Bildpyramide ist die Suche unabhängig von der Bild- und
Markengröße. Außerdem ist der Algorithmus durch die Regionensegmentierung
mithilfe eines dynamischen Schwellenwerts robust gegenüber einer schlechten
oder ungleichmäßigen Beleuchtung. Deswegen sind in der Regel, anders als bei
dem Standardalgorithmus, keine Parameter nötig. Sind dennoch Anpassungen
erwünscht, können ausgewählte Parameter in SizeGaussSizeGaussSizeGaussSizeGausssizeGausssize_gauss
und ihre Werte
in MarkThreshMarkThreshMarkThreshMarkThreshmarkThreshmark_thresh
gesetzt werden. Derzeit ist der folgende Parameter
verfügbar:
- 'gap_tolerance'"gap_tolerance""gap_tolerance""gap_tolerance""gap_tolerance""gap_tolerance":
-
Toleranzfaktor für den Abstand zwischen einzelnen Marken. Falls die
Marken dichter aneinander erscheinen als erwartet, kann man
'gap_tolerance'"gap_tolerance""gap_tolerance""gap_tolerance""gap_tolerance""gap_tolerance" < 1.0 setzen, um zu vermeiden, dass
Störungsmuster außerhalb der Kalibrierplatte mit der Kalibrierplatte
assoziiert werden. Dies ist z.B. dann sinnvoll, wenn die Platte gekippt
aufgenommen wird und der Hintergrund Muster aufweist, die den
Kalibriermarken ähneln. Wenn die Abstände zwischen einzelnen Marken sehr
stark variieren, z.B., wenn die Platte stark perspektivisch verzerrt im
Bild erscheint, kann man 'gap_tolerance'"gap_tolerance""gap_tolerance""gap_tolerance""gap_tolerance""gap_tolerance" > 1.0 setzen und
so auch die Gruppierung über größere Distanzen ermöglichen.
Wertevorschläge: 0.75, 0.9,
1.0 (default)
,
1.1, 1.2, 1.5
Ausführungsinformationen
- Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
- Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
- Automatisch parallelisiert auf Tupelebene.
Parameter
ImageImageImageImageimageimage
(input_object) singlechannelimage(-array) →
objectHImageHObjectHImageHobject (byte / uint2)
Eingabebild.
CalPlateCalPlateCalPlateCalPlatecalPlatecal_plate
(output_object) region →
objectHRegionHObjectHRegionHobject *
Ausgaberegion.
CalPlateDescrCalPlateDescrCalPlateDescrCalPlateDescrcalPlateDescrcal_plate_descr
(input_control) filename.read →
HTuplestrHTupleHtuple (string) (string) (HString) (char*)
Dateiname der Kalibrierkörperbeschreibungsdatei.
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
SizeGaussSizeGaussSizeGaussSizeGausssizeGausssize_gauss
(input_control) integer(-array) →
HTupleMaybeSequence[Union[int, str]]HTupleHtuple (integer / string) (int / long / string) (Hlong / HString) (Hlong / char*)
Filtergröße.
Defaultwert: 3
Werteliste: 0, 3, 5, 7, 9, 11, 'gap_tolerance'"gap_tolerance""gap_tolerance""gap_tolerance""gap_tolerance""gap_tolerance"
MarkThreshMarkThreshMarkThreshMarkThreshmarkThreshmark_thresh
(input_control) integer(-array) →
HTupleMaybeSequence[Union[int, float]]HTupleHtuple (integer / real) (int / long / double) (Hlong / double) (Hlong / double)
Schwellenwert zur Markenextraktion.
Defaultwert: 112
Wertevorschläge: 48, 64, 80, 96, 112, 128, 144, 160, 0.5, 0.9, 1.0, 1.1, 1.5
MinDiamMarksMinDiamMarksMinDiamMarksMinDiamMarksminDiamMarksmin_diam_marks
(input_control) integer →
HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)
Erwarteter Mindestdurchmesser der Kalibrierkörpermarken.
Defaultwert: 5
Wertevorschläge: 3, 5, 9, 15, 30, 50, 70
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)
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)
Beispiel (C++)
// read calibration image
HImage Image("calib/calib_distorted_01");
// find calibration pattern
HRegion CalPlate = Image.FindCaltab("caltab_100mm.descr", 3,112, 5);
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)
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)
Ergebnis
Sind die Parameterwerte korrekt und findet find_caltabfind_caltabFindCaltabFindCaltabFindCaltabfind_caltab
eine passende Bildregion, dann liefert find_caltabfind_caltabFindCaltabFindCaltabFindCaltabfind_caltab
den Wert TRUE.
Das Verhalten bei leerer Eingabe (kein Eingabebild vorhanden) lässt sich
mittels set_system(::'no_object_result',<Result>:)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>)set_system("no_object_result",<Result>)
und das bei leerer Ergebnisregion mit
set_system(::'store_empty_region',<'2 (H_MSG_TRUE)'/'3 (H_MSG_FALSE)'>:)set_system("store_empty_region",<"2 (H_MSG_TRUE)"/"3 (H_MSG_FALSE)">)SetSystem("store_empty_region",<"2 (H_MSG_TRUE)"/"3 (H_MSG_FALSE)">)SetSystem("store_empty_region",<"2 (H_MSG_TRUE)"/"3 (H_MSG_FALSE)">)SetSystem("store_empty_region",<"2 (H_MSG_TRUE)"/"3 (H_MSG_FALSE)">)set_system("store_empty_region",<"2 (H_MSG_TRUE)"/"3 (H_MSG_FALSE)">)
festlegen.
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
Vorgänger
read_imageread_imageReadImageReadImageReadImageread_image
Nachfolger
find_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose
Siehe auch
find_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPosefind_marks_and_pose
,
camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration
,
disp_caltabdisp_caltabDispCaltabDispCaltabDispCaltabdisp_caltab
,
sim_caltabsim_caltabSimCaltabSimCaltabSimCaltabsim_caltab
,
caltab_pointscaltab_pointsCaltabPointsCaltabPointsCaltabPointscaltab_points
,
gen_caltabgen_caltabGenCaltabGenCaltabGenCaltabgen_caltab
Modul
Foundation