lab 2 - forsiden - universitetet i · pdf file๐’’= 27.3,−20.9, ... • samregistrer...

22
Lab 2 04.02.2016

Upload: buicong

Post on 06-Feb-2018

226 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Lab 2

04.02.2016

Page 2: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Ressurser

โ€ข OpenCV documentation: โ€“ http://opencv.org/documentation.html

โ€ข Eigen documentation : โ€“ http://eigen.tuxfamily.org/dox/ โ€“ Quick reference quide: http://eigen.tuxfamily.org/dox/group__QuickRefPage.html

โ€ข C++:

โ€“ http://en.cppreference.com/w/

โ€ข Image Watch: An image debugger plug-in for Visual Studio โ€“ Download directly from Visual Studio:

Tools Extensions and Updatesโ€ฆ Online Search for โ€œImage Watchโ€

2

Page 3: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Litt om cv::Mat

3

Page 4: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Huskeliste

โ€ข Lage prosjekt

โ€ข Konstruere en cv::Mat โ€“ Datatyper, lage ยซvinduerยป โ€“ MatCommaInitializer

โ€ข Hente og endre piksler

โ€“ at<โ€ฆ>() โ€“ forEach

โ€ข Regne pรฅ matriser

โ€“ Operasjoner, MatExpr, โ€ฆ

4

Page 5: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Perspektivkameramodellen

5

Page 6: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

The perspective camera model

6

๐ถ

Vehicle

๐‘„

๐‘Š

๐‘‰

Perspective Camera

World

๐œ‰๐‘‰๐‘Š

๐’’๐ถ

๐œ‰๐ถ๐‘‰

Point observed by the camera

๐‘ง๐‘Š ๐‘ฆ๐‘Š

๐‘ฅ๐‘Š

๐‘ฅ๐‘‰

๐‘ฆ๐‘‰ ๐‘ง๐‘‰

๐‘ง๐ถ

๐‘ฅ๐ถ ๐‘ฆ๐ถ

๐‘Š is a local NED coordinate system (North East Down)

๐ถ is a standard coordinate system for a camera ๐‘ฅ๐ถ - Right ๐‘ฆ๐ถ - Down ๐‘ง๐ถ - Forward

๐‘‰ is a standard coordinate system for a vehicle ๐‘ฅ๐‘‰ - Forward ๐‘ฆ๐‘‰ - Right ๐‘ง๐‘‰ - Down

Page 7: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

The perspective camera model

โ€ข The point ๐‘„ โ€“ Position ๐’’๐‘Š = 27.3,โˆ’20.9,โˆ’11.5 ๐‘‡

โ€ข The vehicle

โ€“ 3m wide, 6m long โ€“ The origin of ๐‘‰ is chosen to be at

the center of the vehicle, 1m above the ground

โ€“ Pose relative to the world: ๐‘ฅ = 6.7๐‘š ๐‘ฆ = โˆ’2.4๐‘š ๐‘ง = โˆ’14.0๐‘š ๐‘Ÿ๐‘Ÿ๐‘Ÿ๐‘Ÿ = 3.7ยฐ ๐‘๐‘๐‘๐‘๐‘ = โˆ’9.3ยฐ ๐‘๐‘’๐‘’๐‘’๐‘๐‘’๐‘’ = 307.6ยฐ

โ€ข The camera โ€“ The optical center is 2m in front of

and 1m to the left of the vehicles center

โ€“ The optical center is 4m above ground

โ€“ The y-axis of ๐ถ is perpendicular to the xy-plane of ๐‘‰

โ€“ The optical axis, i.e. the z-axis of ๐ถ , is rotated 4.7ยฐ to the right of the x-axis of ๐‘‰

โ€“ The camera calibration matrix is

๐พ =1028 0 400

0 1028 3000 0 1

7

Page 8: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

The perspective camera model

Problem In which pixel of the image will we observe the point ๐‘„? Sub-problems 1. Represent ๐œ‰๐‘‰๐‘Š as a SE(3) object ๐‘‡๐‘‰๐‘Š 2. Represent ๐œ‰๐ถ๐‘‰ as a SE(3) object ๐‘‡๐ถ๐‘‰ 3. Represent ๐œ‰๐ถ๐‘Š as a SE(3) object ๐‘‡๐ถ๐‘Š 4. Determine the camera matrix ๐‘ƒ = ๐พ ๐‘… ๐’• 5. Determine the pixel ๐’– = ๐‘ข,๐‘ฃ that the

point ๐‘„ projects to according to the perspective camera model

8

Page 9: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Sub-problem 1

Represent ๐œ‰๐‘‰๐‘Š as a SE(3) object ๐‘‡๐‘‰๐‘Š โ€ข Sophus::SE3d objects can be initialized with a Eigen::Matrix3d rotation matrix ๐‘… and a

Eigen::Vector3d translation vector ๐’• โ€ข Roll, pitch, heading relates to the zyx-rotation sequence, so ๐‘… = ๐‘…๐‘ง๐‘…๐‘ฆ๐‘…๐‘ฅ โ€ข A basic rotation matrix like ๐‘…๐‘ฅ ๐œƒ can be created by

Eigen::AngleAxisd(theta * M_PI / 180, Eigen::Vector3d::UnitX())

9

// Visualization of world and vehicle cv::Mat cv_t_W_V, cv_R_W_V; cv::eigen2cv(t_W_V, cv_t_W_V); cv::eigen2cv(R_W_V, cv_R_W_V); cv::Affine3d cv_T_W_V(cv_R_W_V, cv_t_W_V); cv::viz::Viz3d my_window("window 1"); my_window.showWidget("World-axes", cv::viz::WCoordinateSystem(3.0)); my_window.showWidget("vehicle-axes", cv::viz::WCoordinateSystem(3.0), cv_T_W_V); my_window.showWidget("vehicle", cv::viz::WCube(cv::Vec3d(-3.0, -1.5, -1), cv::Vec3d(3.0, 1.5, 1.0)), cv_T_W_V); my_window.spin();

Page 10: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Sub-problem 2 and 3

Represent ๐œ‰๐ถ๐‘‰ as a SE(3) object ๐‘‡๐ถ๐‘‰ โ€ข Which basic rotations must ๐‘‰ undergo in order to coincide with ๐ถ ? โ€ข Two basic rotations is enough Represent ๐œ‰๐ถ๐‘Š as a SE(3) object ๐‘‡๐ถ๐‘Š โ€ข Recall that ๐‘‡๐ถ๐‘Š = ๐‘‡๐‘‰๐‘Š ๐‘‡๐ถ๐‘‰

10

// Visualization of camera frustum cv::Mat cv_t_W_C, cv_R_W_C, cv_K; cv::eigen2cv(K, cv_K); cv::eigen2cv(T_W_C.translation(), cv_t_W_C); cv::eigen2cv(T_W_C.rotationMatrix(), cv_R_W_C); cv::Affine3d cv_T_W_C(cv_R_W_C, cv_t_W_C); my_window.showWidget("camera_frustum", cv::viz::WCameraPosition(cv_K, 1.0, cv::viz::Color::red()), cv_T_W_C);

Page 11: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Sub-problem 4 and 5

Determine the camera matrix ๐‘ƒ = ๐พ ๐‘… ๐’• โ€ข Recall that in the perspective camera model ๐‘… = ๐‘…๐‘Š๐ถ and ๐‘ = ๐‘๐‘Š๐ถ , so we can not read ๐‘… and

๐’• directly from ๐‘‡๐ถ๐‘Š Determine the pixel ๐’– = ๐‘ข,๐‘ฃ that the point ๐‘„ projects to according to the perspective camera model โ€ข Recall that ๐’–๏ฟฝ = ๐‘ƒ๐‘ฟ๏ฟฝ

11

// Visualization of point (as a small sphere) my_window.showWidget("Q", cv::viz::WSphere({ Q_W(0), Q_W(1), Q_W(2) }, 0.1));

Page 12: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Laplace blending

12

Page 13: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Steg 1: Lag nytt prosjekt og vis frem bilder

โ€ข Kopier ยซopencv_project_templateยป og gi nytt navn โ€“ Husk รฅ endre ยซPROJECT_NAMEยป i CMakeLists.txt

โ€ข Lag nytt prosjekt med Cmake

โ€ข Skriv et program som leser to bilder

โ€“ img_1: free_cat.jpg โ€“ img_2: free_tiger.jpg โ€“ Bildene bรธr konverteres til flyttallsbilder:

cv::imread(โ€ฆ).convertTo(img_1, CV_32F, 1.0/255.0);

โ€ข Vis bildene frem โ€“ cv::namedWindow() โ€“ cv::imshow()

13

Page 14: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Steg 2: Enkel blanding av bilder

โ€ข Samregistrer bildene ved รฅ angi tre punktkorrespondanser

โ€ข Lag maske med rampe

14

cv::Point2f pts_1[] = {{321, 200}, {647, 200}, {476, 509}}; cv::Point2f pts_2[] = {{441, 726}, {780, 711}, {615, 1142}}; cv::Mat trans_mat = cv::getAffineTransform(pts_2, pts_1); cv::warpAffine(img_2, img_2, trans_mat, img_1.size());

cv::Mat mask = cv::Mat::zeros(img_1.size(), CV_32FC1); cv::rectangle(mask, cv::Rect{img_1.cols/2, 0, img_1.cols/2 + 1, img_1.rows}, 1, CV_FILLED); cv::blur(mask, mask, cv::Size{3, 3});

Page 15: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Steg 2: Enkel blanding av bilder

โ€ข Lag funksjon som gjรธr enkel blanding av to bilder vektet med masken

โ€“ Tips: cv::blendLinear()

โ€ข Bruk funksjonen og vis frem resultatet โ€“ Prรธv med forskjellige masker

โ€ข Andre sรธmmer, sirkler, stรธrre glattefilter

15

cv::Mat linear_blend(cv::Mat& img_1, cv::Mat& img_2, cv::Mat& mask)

Page 16: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Steg 3: Laplaceblanding

โ€ข Lag funksjonen โ€“ cv::pyrDown()

16

std::vector<cv::Mat> construct_gaussian_pyramid(cv::Mat& img)

Page 17: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Steg 3: Laplaceblanding

โ€ข Lag funksjonen โ€“ Bruk construct_gaussian_pyramid โ€“ cv::pyrUp()

17

std::vector<cv::Mat> construct_laplacian_pyramid(cv::Mat& img)

Page 18: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Steg 3: Laplaceblanding

โ€ข Lag funksjonen โ€“ cv::pyrUp()

18

cv::Mat collapse_pyramid(std::vector<cv::Mat>& pyr)

Page 19: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Steg 3: Laplaceblanding

โ€ข Lag funksjonen โ€“ For eksempel slik:

19

cv::Mat laplace_blending(cv::Mat& img_1, cv::Mat& img_2, cv::Mat& mask)

std::vector<cv::Mat> mask_pyr = construct_gaussian_pyramid(mask); std::vector<cv::Mat> img_1_pyr = construct_laplacian_pyramid(img_1); std::vector<cv::Mat> img_2_pyr = construct_laplacian_pyramid(img_2); std::vector<cv::Mat> blend_pyr(img_1_pyr.size()); for (int i = 0; i < img_1_pyr.size(); i++) { // TODO: Perform linear blend on each level. } return collapse_pyramid(blend_pyr);

Page 20: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Steg 3: Laplaceblanding

โ€ข Bruk laplace_blending(img_1, img_2, mask) โ€“ Vis frem resultat โ€“ Sammenlign med enkel blending

20

Page 21: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Steg 4: Moroplukk

โ€ข Prรธv andre bilder โ€“ Ta bilder med kameraet โ€“ Finn bilder pรฅ nett โ€“ Angi nye punkter for samregistrering

โ€ข Andre masker

โ€“ Last ned GIMP for รฅ tegne finere masker

21

Page 22: Lab 2 - Forsiden - Universitetet i  · PDF file๐’’= 27.3,−20.9, ... • Samregistrer bildene ved å angi tre punktkorrespondanser ... Mat trans_mat = cv::getAffineTransform

Steg 5: Dypdykk

โ€ข Implementer pyramiden selv โ€“ Ikke bruk cv::pyrDown() eller cv::pyrUp()

โ€ข Ta en titt pรฅ cv::seamlessClone()

โ€ข Prรธv รฅ implementere warpingen selv

22