KlassenKlassenKlassenKlassen | | | | Operatoren

photometric_stereoT_photometric_stereoPhotometricStereophotometric_stereoPhotometricStereoPhotometricStereo (Operator)

Name

photometric_stereoT_photometric_stereoPhotometricStereophotometric_stereoPhotometricStereoPhotometricStereo — Rekonstruieren einer Oberfläche mittels photometrischer Stereomessung.

Signatur

photometric_stereo(Images : HeightField, Gradient, Albedo : Slants, Tilts, ResultType, ReconstructionMethod, GenParamName, GenParamValue : )

Herror T_photometric_stereo(const Hobject Images, Hobject* HeightField, Hobject* Gradient, Hobject* Albedo, const Htuple Slants, const Htuple Tilts, const Htuple ResultType, const Htuple ReconstructionMethod, const Htuple GenParamName, const Htuple GenParamValue)

Herror photometric_stereo(Hobject Images, Hobject* HeightField, Hobject* Gradient, Hobject* Albedo, const HTuple& Slants, const HTuple& Tilts, const HTuple& ResultType, const HTuple& ReconstructionMethod, const HTuple& GenParamName, const HTuple& GenParamValue)

HImage HImage::PhotometricStereo(HImage* Gradient, HImage* Albedo, const HTuple& Slants, const HTuple& Tilts, const HTuple& ResultType, const HTuple& ReconstructionMethod, const HTuple& GenParamName, const HTuple& GenParamValue) const

HImage HImageArray::PhotometricStereo(HImage* Gradient, HImage* Albedo, const HTuple& Slants, const HTuple& Tilts, const HTuple& ResultType, const HTuple& ReconstructionMethod, const HTuple& GenParamName, const HTuple& GenParamValue) const

void PhotometricStereo(const HObject& Images, HObject* HeightField, HObject* Gradient, HObject* Albedo, const HTuple& Slants, const HTuple& Tilts, const HTuple& ResultType, const HTuple& ReconstructionMethod, const HTuple& GenParamName, const HTuple& GenParamValue)

HImage HImage::PhotometricStereo(HImage* Gradient, HImage* Albedo, const HTuple& Slants, const HTuple& Tilts, const HTuple& ResultType, const HString& ReconstructionMethod, const HTuple& GenParamName, const HTuple& GenParamValue) const

HImage HImage::PhotometricStereo(HImage* Gradient, HImage* Albedo, const HTuple& Slants, const HTuple& Tilts, const HTuple& ResultType, const char* ReconstructionMethod, const HTuple& GenParamName, const HTuple& GenParamValue) const

void HOperatorSetX.PhotometricStereo(
[in] IHUntypedObjectX* Images, [out] IHUntypedObjectX*HeightField, [out] IHUntypedObjectX*Gradient, [out] IHUntypedObjectX*Albedo, [in] VARIANT Slants, [in] VARIANT Tilts, [in] VARIANT ResultType, [in] VARIANT ReconstructionMethod, [in] VARIANT GenParamName, [in] VARIANT GenParamValue)

IHImageX* HImageX.PhotometricStereo(
[out] IHImageX*Gradient, [out] IHImageX*Albedo, [in] VARIANT Slants, [in] VARIANT Tilts, [in] VARIANT ResultType, [in] BSTR ReconstructionMethod, [in] VARIANT GenParamName, [in] VARIANT GenParamValue)

static void HOperatorSet.PhotometricStereo(HObject images, out HObject heightField, out HObject gradient, out HObject albedo, HTuple slants, HTuple tilts, HTuple resultType, HTuple reconstructionMethod, HTuple genParamName, HTuple genParamValue)

HImage HImage.PhotometricStereo(out HImage gradient, out HImage albedo, HTuple slants, HTuple tilts, HTuple resultType, string reconstructionMethod, HTuple genParamName, HTuple genParamValue)

Beschreibung

photometric_stereophotometric_stereoPhotometricStereophotometric_stereoPhotometricStereoPhotometricStereo kann dazu genutzt werden, die dreidimensionale Form eines Objekts von seiner zweidimensionalen Textur zu trennen, z.B. von seinem Druckbild. Der Operator benötigt mindestens drei Bilder des gleichen Objekts, aufgenommen mit unterschiedlichen bekannten Beleuchtungsrichtungen. Die Ausrichtung der Kamera zum Objekt muss für alle Bilder gleich sein.

Die dreidimensionale Form des Objekts wird in erster Linie in Form von lokalen Gradienten der dreidimensionalen Oberfläche berechnet. Diese Gradienten können weiter integriert werden, so dass ein Höhenmodell entsteht, d.h., ein Bild, in dem jeder Pixelwert einer relativen Höhe entspricht. Die zweidimensionale Textur wird als Albedo bezeichnet und entspricht der lokalen Lichtabsorption und Reflektionscharakteristik der Oberfläche ohne Einfluß von Schatten.

Typische Anwendungen des photometrischen Stereoverfahrens

Typische Anwendungen des photometrischen Stereoverfahrens sind das Erkennen kleiner Inkonsistenzen in einer Oberfläche, z.B. Defekten, oder das Ausschliessen des Einflusses der Beleuchtungsrichtung auf Bilder, die z.B. für die Druckbildinspektion von nicht flachen Zeichen genutzt werden. Photometrisches Stereo ist nicht geeignet für die Rekonstruktion absoluter Höhen, d.h., es ist keine Alternative zu typischen 3D Rekonstruktionsansätzen wie Depth from Focus oder das Lichtschnittverfahren.

Einschränkungen des photometrischen Stereoverfahrens

photometric_stereophotometric_stereoPhotometricStereophotometric_stereoPhotometricStereoPhotometricStereo basiert auf dem Algorithmus von Woodham und setzt daher zum einen eine orthoskopische Projektion der Kamera voraus, d.h., es muss eine telezentrische Linse oder eine Linse mit einer großen Brennweite benutzt werden. Zum anderen wird vorausgesetzt, dass jede der Lichtquellen parallele und gleichförmige Lichtstrahlen produziert, d.h., es müssen telezentrische Lichtquellen mit gleichförmiger Intensität oder, als Alternative, sehr weit entfernte Lichtquellen benutzt werden. Zusätzlich muss das Objekt Lambertsche Oberflächeneigenschaften aufweisen, d.h., es muss hereinkommendes Licht diffus reflektieren. Objekte oder Regionen eines Objekts, die spiegelnde Reflektionseigenschaften aufweisen (spiegelnde oder glänzende Oberflächen) können nicht korrekt verarbeitet werden und führen daher zu fehlerhaften Ergebnissen.

Der Aufbau

Die Kamera mit der telezentrischen Linse wird orthogonal, d.h., rechtwinklig, zu der zu konstruierenden Szene angebracht. Die Orientierung der Kamera in Bezug auf die Szene darf sich während der Bildaufnahme nicht verändern. Im Gegensatz dazu muss sich die Orientierung der Lichtquelle in Bezug auf die Kamera in mindestens drei Bildern ändern.

Spezifizieren der Beleuchtungsrichtungen

Für jedes Bild werden die Beleuchtungsrichtungen in Form von Winkeln innerhalb der Parameter SlantsSlantsSlantsSlantsSlantsslants und TiltsTiltsTiltsTiltsTiltstilts angegeben. Diese beschreiben die Richtung der Beleuchtung in Bezug auf die Szene. Zum besseren Verständnis dieser Parameter ist zu bedenken, dass der Ansatz davon ausgeht, dass die Lichtquelle parallele Lichtstrahlen erzeugt, die Kamera eine telezentrische Linse hat und die Kamera orthogonal zu der zu konstruierenden Szene angeordnet ist:

Wie oben erwähnt benötigt das photometrische Stereoverfahren mindestens drei Bilder mit verschiedenen Beleuchtungsrichtungen. Allerdings führt die dreidimensionale Geometrie der Objekte typischerweise zu einem Schattenwurf. In den Schattenregionen ist die Anzahl der effektiv verfügbaren Beleuchtungsrichtungen reduziert, so dass Mehrdeutigkeiten entstehen. Um trotzdem ein robustes Ergebnis zu erhalten ist Redundanz nötig. Deshalb sollten normalerweise mehr als drei Lichtquellen mit unterschiedlichen Beleuchtungsrichtungen gewählt werden. Eine steigende Anzahl von Beleuchtungsrichtungen führt aber auch zu einer höheren Anzahl von zu verarbeitenden Bildern und somit zu einer höheren Verarbeitungszeit. In den meisten Anwendungen ist eine Anzahl von vier bis sechs Beleuchtungsrichtungen sinnvoll. Als Faustregel sollten die Winkel in SlantsSlantsSlantsSlantsSlantsslants zwischen 30° und 60° betragen. Die Winkel in TiltsTiltsTiltsTiltsTiltstilts sollten gleichmäßig rund um das zu vermessende Objekt angeordnet sein. Es ist zu beachten, dass die Beleuchtungsrichtungen so gewählt werden müssen, dass sie nicht in der gleichen Ebene liegen, d.h., sie müssen unabhängig sein. Ist dies nicht der Fall, wird eine Exception-Behandlung durchgeführt.

Eingabebilder und Domänen

Die Eingabebilder müssen als Bildvektor in dem Parameter ImagesImagesImagesImagesImagesimages übergeben werden. Jedes Bild muss dabei, wie bereits erwähnt, mit unterschiedlichen Beleuchtungsrichtungen aufgenommen worden sein. Liegen die Bilder in einem Mehrkanalbild vor, können sie mit Hilfe von image_to_channelsimage_to_channelsImageToChannelsimage_to_channelsImageToChannelsImageToChannels in einen Bildvektor konvertiert werden. Alternativ kann ein Bildvektor mittels concat_objconcat_objConcatObjconcat_objConcatObjConcatObj erzeugt werden.

photometric_stereophotometric_stereoPhotometricStereophotometric_stereoPhotometricStereoPhotometricStereo stützt sich auf die Auswertung "photometrischer Information", d.h., den Grauwerten, die in den Bildern gespeichert sind. Diese Information sollte möglichst unverzerrt und genau sein. Es sollte daher sicher gestellt sein, dass die für die Bildaufnahme verwendete Kamera eine lineare Charakterisitk aufweist. Mit dem Operator radiometric_self_calibrationradiometric_self_calibrationRadiometricSelfCalibrationradiometric_self_calibrationRadiometricSelfCalibrationRadiometricSelfCalibration kann die Charakteristik der Kamera bestimmt werden und mit lut_translut_transLutTranslut_transLutTransLutTrans können die Grauwerte im Falle einer nicht-linearen Charakteristik korrigiert werden. Wenn genaue Messungen benötigt werden, sollte außerdem der volle Dynamikumfang der Kamera genutzt werden, da hierdurch genauere Grauwertinformationen erzielt werden. Aus dem selben Grund führen Bilder mit einer Bit-Tiefe von mehr als 8 (z.B. uint2 Bilder statt Byte Bilder) zu einer besseren Genauigkeit.

Die gewählte Domäne der Eingabebilder legt fest, welcher Algorithmus intern zur Verarbeitung der Bilder benutzt wird. Es stehen drei verschiedene Algorithmen zur Verfügung:

Die Ausgabebilder

Der Operator kann Bilder für die rekonstruierten Gradienten (GradientGradientGradientGradientGradientgradient), den Albedo (AlbedoAlbedoAlbedoAlbedoAlbedoalbedo) und das Höhenmodell (HeightFieldHeightFieldHeightFieldHeightFieldHeightFieldheightField) der Oberfläche zurückgeben:

Im Standardfall werden alle diese ikonischen Objekte zurückgeliefert, d.h., der Parameter ResultTypeResultTypeResultTypeResultTypeResultTyperesultType ist auf 'all'"all""all""all""all""all" gesetzt. Falls nur bestimmte Ausgabebilder benötigt werden, kann ResultTypeResultTypeResultTypeResultTypeResultTyperesultType auf ein Tupel gesetzt werden, das festlegt, welche der Ausgabebilder benötigt werden. Zur Auswahl stehen die Werte 'gradient'"gradient""gradient""gradient""gradient""gradient", 'albedo'"albedo""albedo""albedo""albedo""albedo" und 'height_field'"height_field""height_field""height_field""height_field""height_field". In bestimmten Anwendungen, z.B. zur Oberflächeninspektion, werden nur die Bilder für GradientGradientGradientGradientGradientgradient und AlbedoAlbedoAlbedoAlbedoAlbedoalbedo benötigt. Dann kann das Ausschliessen der Oberflächenrekonstruktion die Verarbeitungszeit deutlich beschleunigen, d.h., hier würden für ResultTypeResultTypeResultTypeResultTypeResultTyperesultType nur die Werte 'gradient'"gradient""gradient""gradient""gradient""gradient" und 'albedo'"albedo""albedo""albedo""albedo""albedo", aber nicht 'height_field'"height_field""height_field""height_field""height_field""height_field", übergeben werden.

Intern ermittelt photometric_stereophotometric_stereoPhotometricStereophotometric_stereoPhotometricStereoPhotometricStereo zunächst die Gradienten und, falls benötigt, integriert diese Werte dann, um ein Höhenmodell zu erhalten. Diese Integration wird mit den gleichen Algorithmen ausgeführt, die für den Operator reconstruct_height_field_from_gradientreconstruct_height_field_from_gradientReconstructHeightFieldFromGradientreconstruct_height_field_from_gradientReconstructHeightFieldFromGradientReconstructHeightFieldFromGradient zur Verfügung stehen und mit den Parametern ReconstructionMethodReconstructionMethodReconstructionMethodReconstructionMethodReconstructionMethodreconstructionMethod, GenParamNameGenParamNameGenParamNameGenParamNameGenParamNamegenParamName und GenParamValueGenParamValueGenParamValueGenParamValueGenParamValuegenParamValue kontrolliert werden. Für weitere Informationen zu den Parametern verweisen wir auf die Beschreibung des Operators reconstruct_height_field_from_gradientreconstruct_height_field_from_gradientReconstructHeightFieldFromGradientreconstruct_height_field_from_gradientReconstructHeightFieldFromGradientReconstructHeightFieldFromGradient. Ist ResultTypeResultTypeResultTypeResultTypeResultTyperesultType so gesetzt, dass kein Höhenmodell zurückgegeben wird, werden diese Parameter ignoriert.

Achtung

photometric_stereophotometric_stereoPhotometricStereophotometric_stereoPhotometricStereoPhotometricStereo setzt quadratische Pixel voraus. Außerdem wird vorausgesetzt, dass die Höhen auf einem Gitter der Schrittweite 1 im Objektraum vorliegen. Ist das nicht der Fall, d.h., wenn die Pixelgröße der Kamera projiziert in den Objektraum von 1 abweicht, müssen die zurückgegebenen Höhen mit der tatsächlichen Gitterschrittweite (Wert der Pixelgröße projiziert in den Objektraum) multipliziert werden. Die Größe des Pixels im Objektraum wird berechnet, indem die Größe des Pixels in der Kamera durch die Vergrößerung der (telezentrischen) Linse geteilt wird.

Parallelisierung

Parameter

ImagesImagesImagesImagesImagesimages (input_object)  singlechannelimage(-array) objectHImageHImageHImageHImageXHobject (byte / uint2)

Array mit mindestens drei Bildern mit unterschiedlicher Beleuchtungsrichtung.

HeightFieldHeightFieldHeightFieldHeightFieldHeightFieldheightField (output_object)  image objectHImageHImageHImageHImageXHobject * (real)

Rekonstruiertes Höhenmodell.

GradientGradientGradientGradientGradientgradient (output_object)  image objectHImageHImageHImageHImageXHobject * (vector_field)

Gradientenfeld der Oberfläche.

AlbedoAlbedoAlbedoAlbedoAlbedoalbedo (output_object)  image objectHImageHImageHImageHImageXHobject * (real)

Albedo der Oberfläche.

SlantsSlantsSlantsSlantsSlantsslants (input_control)  angle.deg-array HTupleHTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong) (double / Hlong)

Winkel zwischen der Objektebene und der Richtung der Lichtquelle (im Gradmaß).

Defaultwert: 45.0

Wertevorschläge: 1.0, 5.0, 10.0, 20.0, 40.0, 60.0, 90.0

Typischer Wertebereich: 0.0 ≤ Slants Slants Slants Slants Slants slants ≤ 180.0 (lin)

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 10.0

TiltsTiltsTiltsTiltsTiltstilts (input_control)  angle.deg-array HTupleHTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong) (double / Hlong)

Winkel der Richtung der Lichtquelle innerhalb der Objektebene (im Gradmaß).

Defaultwert: 45.0

Wertevorschläge: 1.0, 5.0, 10.0, 20.0, 40.0, 60.0, 90.0

Typischer Wertebereich: 0.0 ≤ Tilts Tilts Tilts Tilts Tilts tilts ≤ 360.0 (lin)

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 10.0

ResultTypeResultTypeResultTypeResultTypeResultTyperesultType (input_control)  string-array HTupleHTupleHTupleVARIANTHtuple (string) (string) (HString) (char*) (BSTR) (char*)

Zu berechnende ikonische Ergebnisse.

Defaultwert: 'all' "all" "all" "all" "all" "all"

Werteliste: [], 'albedo'"albedo""albedo""albedo""albedo""albedo", 'all'"all""all""all""all""all", 'gradient'"gradient""gradient""gradient""gradient""gradient", 'height_field'"height_field""height_field""height_field""height_field""height_field", 'normalized_gradient'"normalized_gradient""normalized_gradient""normalized_gradient""normalized_gradient""normalized_gradient"

ReconstructionMethodReconstructionMethodReconstructionMethodReconstructionMethodReconstructionMethodreconstructionMethod (input_control)  string HTupleHTupleHTupleVARIANTHtuple (string) (string) (HString) (char*) (BSTR) (char*)

Typ der Rekonstruktionsmethode.

Defaultwert: 'poisson' "poisson" "poisson" "poisson" "poisson" "poisson"

Werteliste: 'fft_cyclic'"fft_cyclic""fft_cyclic""fft_cyclic""fft_cyclic""fft_cyclic", 'poisson'"poisson""poisson""poisson""poisson""poisson", 'rft_cyclic'"rft_cyclic""rft_cyclic""rft_cyclic""rft_cyclic""rft_cyclic"

GenParamNameGenParamNameGenParamNameGenParamNameGenParamNamegenParamName (input_control)  string-array HTupleHTupleHTupleVARIANTHtuple (string) (string) (HString) (char*) (BSTR) (char*)

Namen der generischen Parameter.

Defaultwert: []

Werteliste: 'caching'"caching""caching""caching""caching""caching", 'optimize_speed'"optimize_speed""optimize_speed""optimize_speed""optimize_speed""optimize_speed"

GenParamValueGenParamValueGenParamValueGenParamValueGenParamValuegenParamValue (input_control)  integer-array HTupleHTupleHTupleVARIANTHtuple (integer / real / string) (int / long / double / string) (Hlong / double / HString) (Hlong / double / char*) (Hlong / double / BSTR) (Hlong / double / char*)

Werte der generischen Parameter.

Defaultwert: []

Werteliste: 'exhaustive'"exhaustive""exhaustive""exhaustive""exhaustive""exhaustive", 'free_cache'"free_cache""free_cache""free_cache""free_cache""free_cache", 'no_cache'"no_cache""no_cache""no_cache""no_cache""no_cache", 'patient'"patient""patient""patient""patient""patient", 'standard'"standard""standard""standard""standard""standard", 'use_cache'"use_cache""use_cache""use_cache""use_cache""use_cache"

Ergebnis

Sind die Parameterwerte korrekt, dann liefert photometric_stereophotometric_stereoPhotometricStereophotometric_stereoPhotometricStereoPhotometricStereo den Wert 2 (H_MSG_TRUE), sonst eine Fehlermeldung.

Vorgänger

optimize_fft_speedoptimize_fft_speedOptimizeFftSpeedoptimize_fft_speedOptimizeFftSpeedOptimizeFftSpeed

Modul

3D Metrology


KlassenKlassenKlassenKlassen | | | | Operatoren