~~NOTOC~~ ====== Homework 06 - Panorama ====== ==== Input Images ==== Consider the images were captured with the following EXIF info (focal length is in milimeters): ^ Tag ^ Name ^ Value ^ | 0xa002 | ExifImageWidth | 2400 | | 0xa003 | ExifImageHeight | 1800 | | 0xa20e | FocalPlaneXResolution | 2160000/225 | | 0xa20f | FocalPlaneYResolution | 1611200/168 | | 0xa210 | FocalPlaneResolutionUnit | inch | | 0x920a | FocalLength | 7400/1000 | The images were then resized. | 07 | 06 | 05 | **04 - reference** | 03 | 02 | 01 | |{{http://cw.felk.cvut.cz/courses/GVG/2013/HomeWorks/bridge/bridge_07.jpg?direct&90|bridge_07.jpg}}|{{http://cw.felk.cvut.cz/courses/GVG/2013/HomeWorks/bridge/bridge_06.jpg?direct&90|bridge_06.jpg}}|{{http://cw.felk.cvut.cz/courses/GVG/2013/HomeWorks/bridge/bridge_05.jpg?direct&90|bridge_05.jpg}}| {{http://cw.felk.cvut.cz/courses/GVG/2013/HomeWorks/bridge/bridge_04.jpg?direct&90|bridge_04.jpg}} |{{http://cw.felk.cvut.cz/courses/GVG/2013/HomeWorks/bridge/bridge_03.jpg?direct&90|bridge_03.jpg}}|{{http://cw.felk.cvut.cz/courses/GVG/2013/HomeWorks/bridge/bridge_02.jpg?direct&90|bridge_02.jpg}}|{{http://cw.felk.cvut.cz/courses/GVG/2013/HomeWorks/bridge/bridge_01.jpg?direct&90|bridge_01.jpg}}| ==== Steps ==== - Manually create 10 image matches (point correspondences) between every pair of adjacent images. Store in the cell matrix u such that ''u{i,j}'' are points in the i-th image and ''u{j,i}'' are corresponding points in the j-th image. Save in ''06_data.mat'' - Find homographies ''H_ij'' for every pair of adjacent images by the same method (optimizing 4 over 10) as in HW-05; use your ''u2h_optim'' function for each homography. - Draw 6 histograms of transfer errors of all correspondences into a single image. Use different colour for every histogram, export as ''06_histograms.pdf''. - Compute homographies ''H_i4'' for every i ∈ <1,7> that maps the {{http://cw.felk.cvut.cz/courses/GVG/2013/HomeWorks/bridge|images}} above into the reference image 04 (thus ''H_44'' is identity). Then construct inverse homographies ''H_4i''. - Store all homographies into the cell matrix ''H'', where ''H{i,j}'' is the homography from i to j. Save in''06_data.mat''. - Plot the image borders of the images 02 to 06 transformed to the image plane of the image 04. Export as ''06_borders.pdf''. - Construct a projective panoramic image from the images 03, 04, and 05, in the image plane of the image 04. Save as ''06_panorama.png''. - Construct calibration matrix ''K'' using the actual image size and the original EXIF. All the images share the same calibration. Store it in ''06_data.mat'' - Establish a transformation between each image plane and the coordinate system of the cylinder, described below. - Plot the image borders of all the images mapped onto the cylinder (''06_borders_c.pdf''). - Construct a panoramic image from all the images mapped onto the cylinder (''06_panorama_c.png''). - Optionally, construct a cylindrical panorama from a set of your images (total pan at least 180 degrees) (''06_panorama_c_own.png''). Credited by at most 2 bonus points. In this case submit the input images as well (''06_image01.jpg'', etc ). ^ Example of histogram of errors ^ | {{courses:gvg:labs:06_histograms.png|}} | ^ Example of image borders (origin not shifted) ^ | {{courses:gvg:labs:06_borders.png|}} | | {{courses:gvg:labs:06_borders_c.png|}} | ^ Example of projective panorama (images 3-4-5) ^ | {{courses:gvg:labs:07_panorama.jpg|}} | ^ Example of cylindrical panorama (all images) ^ | {{courses:gvg:labs:07_panorama_c.jpg|}} | ==== The cylinder ==== {{courses:a4m33gvg:labs:07_cylinder.png?direct&200|}} The cylinder is defined in the coordinate system γ (blue) of the image 04 (green) such that: * cylinder axis is equal to c2 axis of γ, * image plane of the image 04 is tangential to the cylinder, * image coordinate system defined on the cylinder surface has square pixels and equal horizontal resolution in the line where it touches the image 04. This leads that the cylinder has radius = 1 in the γ system. The cylinder surface is a set of points [x_{\gamma} y_{\gamma} z_{\gamma}]^\top such that x_{\gamma}^2 + z_{\gamma}^2 = 1 For parametrisation of the cylinder surface we define two coordinate systems: the first (magenta) is based on γ, second (red) is pixel-based system of panoramic image. First, the surface of the cylinder is parametrised by circumference length (equal to angle since radius=1) and by the y_{\gamma} coordinate. The ray \lambda [x_{\gamma} y_{\gamma} z_{\gamma}]^\top intersects the cylinder in the point \lambda=\frac{1}{\sqrt{x_{\gamma}^2 + z_{\gamma}^2}} [ a_{c\gamma}; y_{c\gamma} ] = [ \mbox{the angle given by } x_{\gamma} \mbox{ and } z_{\gamma}; \frac{y_{\gamma}}{\sqrt{x_{\gamma}^2 + z_{\gamma}^2}} ] Second, the pixel size must be applied and image origin adjusted. Since the horizontal pixel size is 1/K(1,1) measured in units given by γ system, this leads to [ x_c; y_c ] = K_{11} [ a_{c\gamma}; y_{c\gamma} ] + [x_{0c}; y_{0c} ] where the origin [x_{0c}; y_{0c}] must be found such that all pixels from the input images will fit into the resulting panorama. ==== Upload ==== Upload an archive consisting of: - ''06_data.mat'' - ''06_histograms.pdf'' - ''06_borders.pdf'' - ''06_panorama.png'' - ''06_borders_c.pdf'' - ''06_panorama_c.png'' - your own images and panorama, if created - hw06.m – your Matlab implementation entry point. any other files required by hw07.m (including data and files from the repository).