find_caltabfind_caltabFindCaltabFindCaltabfind_caltab (Operator)

Name

find_caltabfind_caltabFindCaltabFindCaltabfind_caltab — Segmentieren der Region einer Standard-Kalibrierplatte mit rechteckiger Markenanordnung im Bild.

Signatur

find_caltab(Image : CalPlate : CalPlateDescr, SizeGauss, MarkThresh, MinDiamMarks : )

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)

def find_caltab(image: HObject, cal_plate_descr: str, size_gauss: MaybeSequence[Union[int, str]], mark_thresh: MaybeSequence[Union[int, float]], min_diam_marks: int) -> HObject

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

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