Làm thế nào để bỏ dự đoán tứ giác thành hình chữ nhật?


10

tl; dr: Vấn đề toán học trong hình học chiếu: Làm thế nào để tìm một ma trận máy ảnh 4 x 4 có hình chiếu như minh họa bên dưới, sao cho các điểm A, B, C, D nằm ở đâu đó trên các cạnh của hộp đơn vị (ví dụ: thiết bị chuẩn hóa OpenGL tọa độ) và các góc của hộp đơn vị rơi ở đâu đó hợp lý dọc theo các tia EA, EB, EC, ED?

(Đây có thể là một trường hợp đặc biệt có thể là về một bản đồ đồng nhất, một quan điểm và / hoặc một sự cộng tác. Không quen thuộc với thuật ngữ này.)


công phu

Đưa ra một tứ giác ABCD trong khung nhìn, tôi nghĩ rằng tồn tại một phép biến đổi (?) Duy nhất ánh xạ nó trở lại một hình chữ nhật. Như đã thấy trong hình bên dưới: tứ giác ABCD trong khung nhìn hoạt động như một 'cửa sổ' vật lý, và nếu chúng ta ánh xạ nó trở lại hình chữ nhật thì nó sẽ xuất hiện méo.

nhập mô tả hình ảnh ở đây

(hộp bên phải đại diện cho NDC, mà tôi sẽ nói về sau)

Mục tiêu là nhanh chóng có được hình ảnh bên phải. Chúng tôi có thể raytrace mọi điểm để có được hình ảnh (mà tôi đã thực hiện), nhưng tôi thích sử dụng OpenGL hoặc các kỹ thuật chiếu khác vì tôi muốn tận dụng những thứ như pha trộn, nguyên thủy, v.v.

nỗ lực đầu tiên

Tôi tin rằng tôi có thể giải quyết vấn đề tìm ma trận camera 3x4 làm cho tọa độ đồng nhất 3 + 1 chiều trong không gian 3 (ở bên trái) và chiếu xuống tọa độ đồng nhất 2 + 1 trong không gian 2 (trên bên phải). Người ta có thể giải quyết điều này bằng cách sử dụng phép biến đổi tuyến tính trực tiếp để có được một hệ phương trình Ba=0cho các mục chưa biết acủa ma trận camera và giải hệ thống bằng cách sử dụng phân tách giá trị số ít(SVD). Tôi sẽ lấy các vectơ EA, EB, EC, ED (trong đó E là mắt vật lý của bạn hoặc máy ảnh trong không gian thế giới) làm điểm trong ảnh trước và (0,0), (1,0), (1) , 1), (0,1) hoặc một cái gì đó là các điểm trong ảnh, và mỗi cặp điểm sẽ đưa ra một vài phương trình tuyến tính để cắm vào SVD. Ma trận kết quả sẽ ánh xạ EA -> (0,0), v.v. (giả sử có đủ mức độ tự do tức là nếu giải pháp là duy nhất, điều mà tôi không chắc chắn, hãy xem ghi chú [a].)

Nhưng với sự thất vọng của tôi, đây không phải là cách OpenGL hoạt động. OpenGL không trực tiếp chiếu 3d đến 2d với ma trận 3x4. OpenGL yêu cầu "tọa độ thiết bị chuẩn hóa" (NDC), là các điểm ba chiều. Sau khi chiếu vào NDC, mọi thứ trong hộp 'đơn vị' từ (-1, -1, -1,1) đến (1,1,1,1) được rút ra; mọi thứ bên ngoài đều bị cắt bớt (vì chúng ta đang xử lý các tọa độ đồng nhất: mọi điểm (x, y, z, w) sẽ chỉ xuất hiện trên màn hình nếu ba tọa độ đầu tiên của (x / w, y / w, z / w , 1) nằm trong hộp đơn vị từ -1 đến 1).

Vì vậy, câu hỏi trở thành: có tồn tại một số biến đổi hợp lý ánh xạ một số hình khối trông kỳ lạ theo tọa độ đồng nhất (cụ thể là hình khối được vẽ ở bên trái, với ABCD (điểm trước) và A'B'C'D '(điểm sau, ẩn phía sau các điểm phía trước)) cho khối đơn vị, ví dụ: sử dụng ma trận 4 x 4? Làm thế nào để một người làm điều đó?

những gì tôi đã thử

Tôi đã thử một thứ gì đó mạnh mẽ hơn: Tôi đã làm cho ABCD và A'B'C'D 'trông giống như một sự thất vọng hình chóp thông thường (ví dụ như gl bực bội) (nghĩa là trong thiết lập giả thuyết này, hình ảnh bên trái sẽ có hình chữ nhật màu đen được đặt chồng lên trên nó, không phải là một hình tứ giác), và sau đó sử dụng phép biến đổi tuyến tính DLT / trực tiếp để giải cho ma trận 4 x 4 bị cáo buộc. Tuy nhiên, khi tôi thử nó, dường như không có đủ mức độ tự do ... ma trận 4x4 kết quả không ánh xạ mọi vectơ đầu vào tới mọi vectơ đầu ra. Trong khi sử dụng A, B, C, D, A '(5 cặp vectơ trước biến đổi và sau biến đổi), tôi / gần như / nhận kết quả tôi muốn ... các vectơ được ánh xạ chính xác, nhưng ví dụ B', C ', D' đang ánh xạ tới (3,3,1,1) thay vì (-1, -1,1,1) và bị OpenGL cắt bớt. Nếu tôi thử thêm điểm thứ sáu (6 cặp điểm cho ma trận 4x4 vào dự án), giải pháp của tôi có vẻ thoái hóa (số không, infinites). Tôi có thể giải quyết được bao nhiêu bậc tự do ở đây, và điều này có thể xảy ra với ma trận 4 x 4 ánh xạ 4 vectơ thông thường (vectơ tọa độ đồng nhất 3 + 1 chiều) mà chúng ta biết và yêu thích không?

ý nghĩ nhỏ ngẫu nhiên

Tôi đoán rằng không thể ánh xạ bất kỳ hình khối tùy ý nào vào bất kỳ hình khối tùy ý nào bằng ma trận 4 x 4, mặc dù tôi bối rối vì tôi nghĩ có thể ánh xạ bất kỳ tứ giác lồi nào sang bất kỳ tứ giác lồi nào khác trong 2d với một số ma trận như trong , giả sử, Photoshop? ... có thể / không thể thực hiện điều này với một biến đổi phóng chiếu? Và làm thế nào để nó khái quát lên 3d? ...... Cũng đã thất bại trong việc tìm kiếm ma trận 4 x 4, đại số tuyến tính nói rằng chúng ta không nên mong đợi một ma trận NxN ánh xạ nhiều hơn N điểm độc lập tuyến tính đến N điểm trong trường hợp tốt nhất, nhưng tôi cảm thấy rằng bằng cách nào đó đồng nhất tọa độ gian lận này bởi vì có một số colinearity ẩn đang diễn ra? Tôi đoán là không?

giải pháp khác?

Tôi đoán người ta cũng có thể làm điều xấu xí sau đây, khi bạn sử dụng ma trận chiếu máy ảnh gây khó chịu điển hình, tìm các điểm 2d tương ứng với các góc, sau đó thực hiện phối cảnh méo mó 2d, nhưng nếu điều đó xảy ra sau khi các pixel được hiển thị (ví dụ như photoshop) sau đó sẽ có vấn đề với độ phân giải ... có thể giả thuyết người ta có thể tìm ra một ma trận để thực hiện phép biến đổi này trên mặt phẳng XY trong không gian NDC, sau đó kết hợp nó với ma trận dựa trên sự thất vọng thông thường?

(lưu ý [a]: Mức độ tự do: ABCD có thể bị hạn chế hơn nữa là hình ảnh hậu của một phép biến đổi phóng xạ tác động lên một hình chữ nhật, nếu điều đó là cần thiết ... đó có thể nói là hình chữ nhật màu đen bên trái kết quả của việc chiếu mô hình clipart khung hình)


1
Nếu bạn google cho pin góc, bạn sẽ nhận được một vài triển khai này
joojaa

Câu trả lời:


1

Tôi nghĩ rằng giải pháp đang tìm kiếm biến đổi phóng xạ biến đổi chính xác bốn điểm.

I E

y=P×x

trong đó vày = [ y 0x=[x0,x1,1]y=[y0y2,y1y2]

P là ma trận 3x3 với 9 mục. Do sự chuẩn hóa cuối cùng, nó là duy nhất cho đến tỷ lệ, để lại 8 bậc tự do, được xác định duy nhất bởi 8 phương trình được đưa ra bởi sự tương ứng (2 cho mỗi cặp điểm).

Bây giờ bạn có thể sử dụng đại số để làm điều này hoặc chỉ sử dụng OpenCV's getPerspectiveTransform:).

Ngoài ra, hãy kiểm tra tọa độ đồng nhất trên wikipedia để làm quen với khái niệm này.


Cảm ơn bạn! (Tôi đã giải quyết điều này một lúc trước và đăng giải pháp ngay bây giờ khi tôi thấy bình luận của bạn.)
ninjagecko

0

Tôi đã giải quyết câu hỏi của riêng mình bằng cách thực hiện Chuyển đổi tuyến tính trực tiếp . Phần ví dụ trên Wikipedia là trường hợp sử dụng của tôi.

Để có được các phương trình, hãy cắm các ma trận (ví dụ [x1 x2 x3 x4; x5 x6 x7 x8; x9 x10 x11 x12]) vào hệ thống đại số máy tính yêu thích của bạn như SageMath, sau đó Giải phương trình ma trận cần thiết như minh họa, sao chép-dán các giải pháp theo các biến vào mã của bạn và điều chỉnh định dạng.

Sau đó, người ta có thể điều chỉnh giải pháp cho trường hợp sử dụng của một người bằng cách chia tỷ lệ hoặc bỏ qua các kích thước cụ thể khi thích hợp (ví dụ: bỏ qua tọa độ độ sâu / z trong ma trận Tọa độ thiết bị chuẩn hóa phù hợp với trường hợp sử dụng).

Bạn sẽ cần một hàm phân tách SVD hoặc thư viện bằng ngôn ngữ của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.