gen_binocular_proj_rectification
— Projektive Rektifizierung eines schwach kalibrierten Stereo-Bildpaares.
gen_binocular_proj_rectification( : Map1, Map2 : FMatrix, CovFMat, Width1, Height1, Width2, Height2, SubSampling, Mapping : CovFMatRect, H1, H2)
Eine binokulare Stereokonfiguration wird schwach kalibriert genannt, wenn die Fundamental-Matrix, welche die projektive Beziehung der beiden Bilder beschreibt, bekannt ist. Rektifizierung ist das Finden eines geeigneten Satzes von Transformationen, welcher die beiden Bilder derart transformiert, dass alle korrespondierenden Epipolargeraden identisch sind und parallel zur horizontalen Achse verlaufen. Rektifizierte Bilder erscheinen vergleichbar einer Stereoanordnung, bei der die linke und rechte Bildebene identisch sind und die relative Lage der Kamerazentren nur aus einer horizontalen Translation besteht. Eine Rektifizierung ist nur möglich, wenn beide Epipole außerhalb der Bildbereiche liegen.
Typischerweise wird die Fundamental-Matrix FMatrix
vorher durch den
Operator match_fundamental_matrix_ransac
berchnet. Ausgehend von
der Fundamental-Matrix werden die beiden Homographien (d.h. projektive
Transformationen) H1
und H2
berechnet, welche die
Rektifizierung der beiden Bilder beschreiben. Da die projektive
Rektifizierung ein unterbestimmtes Problem darstellt, werden zusätzliche
Bedingungen aufgestellt: Es werden diejenigen Transformation gewählt,
welche die projektive Verzerrung minimal halten. Für diese Berechnung
sind die Dimensionen der Bildbereiche Width1
,Height1
,
Width2
und Height2
notwendig. Nach der Rektifizierung
hat die Fundamental-Matrix immer folgende kanonische Form:
Ist die Kovarianzmatrix CovFMat
der Fundamental-Matrix
FMatrix
bekannt, so wird auch die Kovarianzmatrix
CovFMatRect
der obigen rektifizierten Fundamental-Matrix berechnet.
Im Rahmen eines nachfolgenden Stereo-Matchings kann diese dazu dienen den
Matching Prozess zu verbessern, da die Kovarianzmatrix den Bereich angibt,
wo ein korrespondierender Match zu finden ist.
Ähnlich des verwandten Operators gen_binocular_rectification_map
beschreiben die Ausgabebilder Map1
und Map2
die
Transformationen, welche das Stereobildpaar rektifizieren. Der Parameter
Mapping
gibt an, ob für die Abbildung bilineare Interpolation
('bilinear_map' ) verwendet werden soll, oder ob einfach der nächste
Nachbar ('nn_map' ) zu wählen ist. Die Größe bzw. Auflösung der
Abbildungskarten ist über SubSampling
einzustellen. Ein Wert von
zum Beispiel 2 halbiert die Bildgröße. Wenn nur die Homographien
und nicht die Abbildungskarten gewünscht sind, ist die Option
Mapping
auf 'no_map' zu setzen.
Unter dem Aspekt der Rechengeschwindigkeit ist diese Wahl zu bevorzugen,
wenn für eine spezifische Stereokonfiguration nur ein Bildpaar rektifiziert
werden soll. Wenn dagegen die Stereokonfiguration fix ist, so sollten nur
einmal die Abbildungskarten berechnet werden; alle weiteren Bildpaare
werden dann mit Hilfe des Operators map_image
rektifiziert, was zum
geringsten Rechenaufwand zur online Rektifizierung führt.
Bei der Verwendung der Abbildungskarten haben die transformierten Bilder
dieselbe Größe wie die Karten. Jedes Pixel in der Karte enthält die
Information, wie das neue Pixel an dieser Position generiert wird. Die Karten
Map1
, Map2
sind einkanalige Bilder, wenn Mapping
auf 'nn_map' gesetzt ist, und bestehen aus fünf Kanälen, wenn
'bilinear_map' gewünscht wird. Im ersten Kanal, welcher vom Datentyp
int4 ist, wird die lineare Koordinate des im Originalbild referenzierten
Pixels gespeichert. Mit Mapping
gleich 'nn_map' ist das
referenzierte Pixel der nächste Nachbar des zurücktransformierten
Kartenpixels. Im Falle der bilinearen Interpolation ist das Referenzpixel
die nächste obere, linke Ecke des zurücktransformierten Pixels.
Die folgende Abbildung zeigt die Ordnung der Pixel im Originalbild, welche
den zurücktransformierten Koordinaten am nächsten sind, wobei das
Referenzpixel die Nummer zwei trägt:
2 | 3 |
4 | 5 |
Die Kanäle 2 bis 5, welche vom Datentyp uint2 sind, enthalten die Gewichte der entsprechenden Pixel für die bilineare Interpolation.
Für ein rektifiziertes Bildpaar kann die Disparität zwischen Bildpunkten
oder Regionen mittels des Operators binocular_disparity
berechnet
werden. Im Gegensatz zum Stereo bei voll kalibrierten Kameras mit der
Rektifizierung mittels gen_binocular_rectification_map
kann bei
schwach kalibrierten Kameras keine metrische Tiefeninformation abgeleitet
werden. Die Disparität gibt dann lediglich eine qualitative Tiefenordnung
der betrachteten Szene wieder.
Map1
(output_object) image(-array) →
object (int4 / uint2)
Bild, das die Rektifizierung des 1. Bildes codiert.
Map2
(output_object) image(-array) →
object (int4 / uint2)
Bild, das die Rektifizierung des 2. Bildes codiert.
FMatrix
(input_control) hom_mat2d →
(real / integer)
Fundamental-Matrix.
CovFMat
(input_control) number-array →
(real / integer)
9x9 Kovarianzmatrix der Fundamental-Matrix.
Defaultwert: []
Width1
(input_control) integer →
(integer)
Breite des 1. Bildes.
Defaultwert: 512
Wertevorschläge: 128, 256, 512, 1024
Restriktion: Width1 > 0
Height1
(input_control) integer →
(integer)
Höhe des 1. Bildes.
Defaultwert: 512
Wertevorschläge: 128, 256, 512, 1024
Restriktion: Height1 > 0
Width2
(input_control) integer →
(integer)
Breite des 2. Bildes.
Defaultwert: 512
Wertevorschläge: 128, 256, 512, 1024
Restriktion: Width2 > 0
Height2
(input_control) integer →
(integer)
Höhe des 2. Bildes.
Defaultwert: 512
Wertevorschläge: 128, 256, 512, 1024
Restriktion: Height2 > 0
SubSampling
(input_control) number →
(integer / real)
Unterabtastfaktor.
Defaultwert: 1
Werteliste: 1, 2, 3, 1.5
Mapping
(input_control) string →
(string)
Typ des Mappings.
Defaultwert: 'no_map'
Werteliste: 'bilinear_map' , 'nn_map' , 'no_map'
CovFMatRect
(output_control) number-array →
(real)
9x9 Kovarianzmatrix der rektifizierten Fundamental-Matrix.
H1
(output_control) hom_mat2d →
(real)
Projektive Transformation des 1. Bildes.
H2
(output_control) hom_mat2d →
(real)
Projektive Transformation des 2. Bildes.
* Rectify an image pair using a map. get_image_size (Image1, Width1, Height1) get_image_size (Image2, Width2, Height2) points_harris (Image1, 3, 1, 0.2, 10000, Row1, Col1) points_harris (Image2, 3, 1, 0.2, 10000, Row2, Col2) match_fundamental_matrix_ransac (Image1, Image2, Row1, Col1, Row2, Col2, \ 'ncc', 21, 0, 200, 20, 50, 0, 0.9, \ 'gold_standard', 0.3, 1, FMatrix, \ CovFMat, Error, Points1, Points2) gen_binocular_proj_rectification (Map1, Map2, FMatrix, [], Width1, \ Height1, Width2, Height2, 1, \ 'bilinear_map', CovFMatRect, H1, H2) map_image (Image1, Map1, Image1Rect) map_image (Image2, Map2, Image2Rect) * Rectify an image pair without using a map. get_image_size (Image1, Width1, Height1) get_image_size (Image2, Width2, Height2) points_harris (Image1, 3, 1, 0.2, 10000, Row1, Col1) points_harris (Image2, 3, 1, 0.2, 10000, Row2, Col2) match_fundamental_matrix_ransac (Image1, Image2, Row1, Col1, Row2, Col2, \ 'ncc', 21, 0, 200, 20, 50, 0, 0.9, \ 'gold_standard', 0.3, 1, FMatrix, \ CovFMat, Error, Points1, Points2) gen_binocular_proj_rectification (Map1, Map2, FMatrix, [], Width1, \ Height1, Width2, Height2, 1, \ 'no_map', CovFMatRect, H1, H2) * Determine the maximum extent of the two rectified images. projective_trans_point_2d (H1, [0,0,Height1,Height1], \ [0,Width1,0,Width1], [1,1,1,1], R1, C1, W1) R1 := int(floor(R1/W1)) C1 := int(floor(C1/W1)) projective_trans_point_2d (H2, [0,0,Height2,Height2], \ [0,Width2,0,Width2], [1,1,1,1], R2, C2, W2) R2 := int(floor(R2/W2)) C2 := int(floor(C2/W2)) WidthRect := max([C1,C2]) HeightRect := max([R1,R2]) projective_trans_image_size (Image1, Image1Rect, H1, 'bilinear', \ WidthRect, HeightRect, 'false') projective_trans_image_size (Image2, Image2Rect, H2, 'bilinear', \ WidthRect, HeightRect, 'false')
match_fundamental_matrix_ransac
,
vector_to_fundamental_matrix
map_image
,
projective_trans_image
,
binocular_disparity
gen_binocular_rectification_map
J. Gluckmann and S.K. Nayar: „Rectifying transformations that minimize resampling effects“; IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2001, vol I, pages 111-117.
3D Metrology