Giới thiệu về Homography trong opencv

1. Homography là gì?

Trong toán học, Homography là sự dịch chuyển sử dụng phép chiếu hình học, hay nói cách khác nó là sự kết hợp của cặp điểm trong phép chiếu phối cảnh. Ảnh thực trong không gian ba chiều có thể biến đổi về không gian ảnh bằng phép chiếu thông qua ma trận biến đổi Homography hay còn gọi là ma trận H. Các phép chiếu biến đổi thông qua ma trận Homography không đảm bảo về kích thước và góc của vật được chiếu, nhưng lại đảm bảo về tỉ lệ.

Homography là một ánh xạ từ mặt phẳng đối tượng đến mặt phẳng ảnh. Ma trận Homography thường có liên quan đến các công việc xử lý giữa hai ảnh bất kì và có ứng dụng rất rộng rãi trong các công tác sửa ảnh, ghép ảnh, tính toán sự chuyển động, xoay hay dịch chuyển giữa hai ảnh

Ta có công thức sau: HX = sX’
Trong đó:
s : là hằng số tỉ lệ của phép chiếu và khác 0
X’: là kết quả của phép ánh xạ
X: là đối tượng ảnh được ánh xạ
H : là ma trận Homography, là một ma trận khả nghịch.
Trong trường hợp muốn tạo ảnh X từ X’, ta chỉ cần xác định được ma trận Homography.

Xét hình ảnh sau:

Trên 2 cuốn sách hình ảnh, ta xét 4 cặp điểm tương ứng đó là những điểm màu đỏ, vàng, xanh và da cam.

Homography là một ma trận 3×3:


Xét một cặp điểm tương ứng trên 2 hình ảnh cuốn sách ở trên. Ví dụ (x1, y1) trên hình 1 và (x2, y2) trên hình 2 và ta có :

Phương trình trên đúng với tất cả các điểm tương ứng trên hai cuốn sách. Vậy khi có được ma trận H ta có thể xoay hình ảnh cuốn sách thứ nhất về góc độ của cuốn sách trên ảnh thứ hai.

2. Tính toán một ma trận Homography với opencv:

Để tính toán một Homography giữa hai hình ta cần ít nhất bốn điểm tương ứng giữa hai hình, nhiều hơn càng tốt. Opencv sẽ ước tính một Homography phù hợp với tất cả các điểm tương ứng.

Code C++: ta cần xoay hình ảnh book2 theo ảnh book1.

#include “opencv2/opencv.hpp”

using namespace cv;
using namespace std;

int main( int argc, char** argv)
{
//Đọc ảnh cần xoay.
Mat im_src = imread(“book2.jpg”);
// 4 điểm tương ứng trên cuốn sách cần xoay
vector<Point2f> pts_src;
pts_src.push_back(Point2f(141, 131));
pts_src.push_back(Point2f(480, 159));
pts_src.push_back(Point2f(493, 630));
pts_src.push_back(Point2f(64, 601));

// Đọc ảnh cần xoay theo.
Mat im_dst = imread(“book1.jpg”);
// 4 điểm tương ứng với 4 điểm trên hình ảnh cần xoay.
vector<Point2f> pts_dst;
pts_dst.push_back(Point2f(318, 256));
pts_dst.push_back(Point2f(534, 372));
pts_dst.push_back(Point2f(316, 670));
pts_dst.push_back(Point2f(73, 473));

// Tìm ma trận Homography của hia hình ảnh
Mat h = findHomography(pts_src, pts_dst);

Mat im_out;
// Xoay hình ảnh càn xoay theo Homography
warpPerspective(im_src, im_out, h, im_out.size());
// im_src: là ảnh cần xoay.
// im_out: là hình kết quả.
// h: là Homography đã tính toán ở trên.
// im_out: là hình kết quả.
// im_out.size: là kích thước ảnh kết quả

    //Show ảnh
imshow(“Source Image”, im_src);
imshow(“Destination Image”, im_dst);
imshow(“Warped Source Image”, im_out);

waitKey(0);
}

3. Ứng dụng của Homography.

Ứng dụng quan trọng của homography là tạo ảnh panoramas( ảnh hoặc cảnh ở tầm rộng, toàn cảnh hoặc cũng có thể hiểu là cảnh quay lia). Tìm kiếm một đối tượng biết trước.

4. Một hàm tương tự Homography trong 2D.

Phép biến đổi Affine:
Phép biến đổi Affine là phép biến đổi toạ độ điểm đặc trưng của đối tượng thành tập tương ứng các điểm mới để tạo ra các hiệu ứng cho toàn đối tượng.
Ví dụ: phép biến đổi toạ độ với chỉ 2 điểm đầu cuối của đoạn thẳng tạo thành 2 điểm mới mà khi nối chúng với nhau tạo thành đoạn thẳng mới.

Mọi phép biến đổi phức tạp đều có thể tạo thành từ các phép biến đổi cơ sở như:
– Dịch chuyển (Translation)
– Tỉ lệ (Scaling)
– Quay (Rotation)
– Biến dạng (Shearing)

Biến đổi Affine là một ma trân 2×3.


Cho một điểm (x, y) biến đổi Affine biến nó thành điểm (xt, yt)

Trong opencv, hàm warpAffine( src, dst, InputArray M, dst_size ) dùng để thực hiện biến đổi Affine.
Trong đó:
Src: là ảnh đầu vào.
Dst: là ảnh kết quả nhận được.
M: là ma trận biến đổi.
Dst_size: là kích thước ảnh kết quả.

 

Leave a Reply

Your email address will not be published. Required fields are marked *