Name
smallest_circlesmallest_circleSmallestCirclesmallest_circleSmallestCircleSmallestCircle — Ermitteln des kleinsten umschließenden Kreises einer Region.
smallest_circlesmallest_circleSmallestCirclesmallest_circleSmallestCircleSmallestCircle bestimmt den kleinsten umschließenden Kreis
einer Region, also den Kreis mit dem kleinsten Flächeninhalt unter
allen Kreisen, die die Region enthalten. Für diesen Kreis werden der
Mittelpunkt (RowRowRowRowRowrow,ColumnColumnColumnColumnColumncolumn) und der Radius
(RadiusRadiusRadiusRadiusRadiusradius) berechnet. Der Operator findet Anwendung, wenn
z.B. die Lage und Größe von kreisförmigen Objekten (z.B. Münzen)
bestimmt werden soll, die aber aufgrund schlechter Segmentation im
Inneren nicht homogen sind oder unterbrochene Ränder besitzen. Die
Ausgabe des Operators ist so gewählt, dass sie als Eingabe für die
Operatoren disp_circledisp_circleDispCircledisp_circleDispCircleDispCircle und gen_circlegen_circleGenCirclegen_circleGenCircleGenCircle
verwendet werden kann.
Werden mehrere Regionen in RegionsRegionsRegionsRegionsRegionsregions übergeben, so werden
entsprechende Tupel als Ausgabeparameter zurückgegeben.
Bei leerer Region haben alle Parameter den Wert 0.0, soweit kein
anderes Verhalten eingestellt wurde (siehe set_systemset_systemSetSystemset_systemSetSystemSetSystem).
Intern erfolgt die Berechnung basierend auf den
Mittelpunktskoordinaten der Regionenpixel. Um zu berücksichtigen,
dass Pixel im Regionenfall eigentlich flächenhaft zu interpretieren
sind, wird der berechnete Radius zum Schluss noch um 0.5
vergrößert. Dies gibt in den meisten Fällen ein gutes Ergebnis, im
ungünstigsten Fall (Pixeldiagonale) ist diese Vergrößerung allerdings
nicht ausreichend. Wollte man sicherstellen, dass der Umriss der
Eingaberegion komplett innerhalb des Kreises liegt, müsste man
1/sqrt(2) anstatt 0.5 addieren. Folglich müsste der
in RadiusRadiusRadiusRadiusRadiusradius zurückgegebene Wert um
1/sqrt(2)-0.5 korrigiert werden. Dies wäre
allerdings auch nur eine obere Abschätzung, d.h. der Kreis mit dem
korrigierten Radius wäre in den meisten Fällen etwas zu groß.
- Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
- Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
- Automatisch parallelisiert auf Tupelebene.
Zu untersuchende Regionen.
Zeilenindex des Mittelpunktes.
Spaltenindex des Mittelpunktes.
Radius des umschließenden Kreises.
Zusicherung: Radius >= 0
read_image(Image,'fabrik')
open_window(0,0,-1,-1,'root','visible','',WindowHandle)
regiongrowing(Image,Seg,5,5,6,100)
select_shape(Seg,H,'area','and',100,2000)
smallest_circle(H,Row,Column,Radius)
gen_circle(Circles,Row,Column,Radius)
set_draw(WindowHandle,'margin')
disp_region(Circles,WindowHandle)
read_image(&Image,"fabrik");
open_window(0,0,-1,-1,0,"visible","",&WindowHandle);
regiongrowing(Image,&Seg,5,5,6.0,100);
select_shape(Seg,&H,"area","and",100.0,2000.0);
T_smallest_circle(H,&Row,&Column,&Radius);
T_gen_circle(&Circles,Row,Column,Radius);
set_draw(WindowHandle,"margin");
disp_region(Circles,WindowHandle);
read_image(Image,'fabrik')
open_window(0,0,-1,-1,'root','visible','',WindowHandle)
regiongrowing(Image,Seg,5,5,6,100)
select_shape(Seg,H,'area','and',100,2000)
smallest_circle(H,Row,Column,Radius)
gen_circle(Circles,Row,Column,Radius)
set_draw(WindowHandle,'margin')
disp_region(Circles,WindowHandle)
#include "HIOStream.h"
#if !defined(USE_IOSTREAM_H)
using namespace std;
#endif
#include "HalconCpp.h"
using namespace Halcon;
int main (int argc, char *argv[])
{
Tuple row, col, rad;
HImage img (argv[1]);
HWindow w;
img.Display (w);
HRegionArray reg = img.Regiongrowing (5, 5, 6.0, 100);
HRegionArray seg = reg.SelectShape ("area", "and", 100.0, 1000.0);
row = seg.SmallestCircle (&col, &rad);
HRegionArray circ = HRegionArray::GenCircle (row, col, rad);
w.SetDraw ("margin");
w.SetColor ("green"); reg.Display (w);
w.SetColor ("blue"); seg.Display (w);
w.SetColor ("red"); circ.Display (w);
w.Click ();
return(0);
}
read_image(Image,'fabrik')
open_window(0,0,-1,-1,'root','visible','',WindowHandle)
regiongrowing(Image,Seg,5,5,6,100)
select_shape(Seg,H,'area','and',100,2000)
smallest_circle(H,Row,Column,Radius)
gen_circle(Circles,Row,Column,Radius)
set_draw(WindowHandle,'margin')
disp_region(Circles,WindowHandle)
read_image(Image,'fabrik')
open_window(0,0,-1,-1,'root','visible','',WindowHandle)
regiongrowing(Image,Seg,5,5,6,100)
select_shape(Seg,H,'area','and',100,2000)
smallest_circle(H,Row,Column,Radius)
gen_circle(Circles,Row,Column,Radius)
set_draw(WindowHandle,'margin')
disp_region(Circles,WindowHandle)
Sei F die Fläche der Region dann beträgt die Laufzeitkomplexität
O(sqrt(F)).
smallest_circlesmallest_circleSmallestCirclesmallest_circleSmallestCircleSmallestCircle liefert den Wert 2 (H_MSG_TRUE), falls die Eingabe
nicht leer ist. Das Verhalten bei leerer Eingabe (keine Eingaberegionen
vorhanden) lässt sich mittels
set_system('no_object_result',<Result>)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>) festlegen.
Das Verhalten bei einer leeren Region (Region ist die leere Menge)
wird mit set_system('empty_region_result',<Result>)set_system("empty_region_result",<Result>)SetSystem("empty_region_result",<Result>)set_system("empty_region_result",<Result>)SetSystem("empty_region_result",<Result>)SetSystem("empty_region_result",<Result>) bestimmt.
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
thresholdthresholdThresholdthresholdThresholdThreshold,
regiongrowingregiongrowingRegiongrowingregiongrowingRegiongrowingRegiongrowing,
connectionconnectionConnectionconnectionConnectionConnection,
runlength_featuresrunlength_featuresRunlengthFeaturesrunlength_featuresRunlengthFeaturesRunlengthFeatures
gen_circlegen_circleGenCirclegen_circleGenCircleGenCircle,
disp_circledisp_circleDispCircledisp_circleDispCircleDispCircle
elliptic_axiselliptic_axisEllipticAxiselliptic_axisEllipticAxisEllipticAxis,
smallest_rectangle1smallest_rectangle1SmallestRectangle1smallest_rectangle1SmallestRectangle1SmallestRectangle1,
smallest_rectangle2smallest_rectangle2SmallestRectangle2smallest_rectangle2SmallestRectangle2SmallestRectangle2
set_shapeset_shapeSetShapeset_shapeSetShapeSetShape,
select_shapeselect_shapeSelectShapeselect_shapeSelectShapeSelectShape,
inner_circleinner_circleInnerCircleinner_circleInnerCircleInnerCircle
Foundation