Làm thế nào để thay đổi kích thước hình ảnh ảnh hưởng đến ma trận camera bên trong?


18

Tôi có một ma trận camera (tôi biết cả thông số bên trong và bên ngoài) được biết đến với hình ảnh có kích thước HxW. (Tôi sử dụng ma trận này cho một số tính toán tôi cần).

Tôi muốn sử dụng một hình ảnh nhỏ hơn, nói: H2×W2 (một nửa bản gốc). Tôi cần thay đổi gì với ma trận để giữ mối quan hệ tương tự?

Tôi có, là các tham số nội tại, ( R , T xoay và dịch)KRT

cam=K[RT]

K=(ax0u00ayv0001)

là 3 * 3, tôi đã nghĩ về việc nhân a x , a y , u 0 v 0 với 0,5 (yếu tố hình ảnh được thay đổi kích thước), nhưng tôi không chắc chắn.Kaxayu0v0

Câu trả lời:


13

Lưu ý: Điều đó phụ thuộc vào tọa độ bạn sử dụng trong hình ảnh đã thay đổi kích thước. Tôi giả sử rằng bạn đang sử dụng hệ thống dựa trên số không (như C, không giống như Matlab) và 0 được chuyển thành 0. Ngoài ra, tôi giả sử rằng bạn không có độ lệch giữa các tọa độ. Nếu bạn có một độ lệch, nó cũng nên được nhân lên

Trả lời ngắn gọn : Giả sử bạn đang sử dụng một hệ tọa độ trong đó u=u2,v=v2 , vâng, bạn nên nhânax,ay,u0,v0 với 0,5.

Trả lời chi tiết Hàm chuyển đổi điểm P trong tọa độ thế giới sang tọa độ camera (x,y,z,1)>(u,v,S) là:

(ax0u00ayv0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Trong đó (u,v,S)>(u/S,v/S,1) , vì tọa độ là đồng nhất.

Nói tóm lại, điều này có thể được viết là u=m1Pm3P,v=m2Pm3P
trong đóMlà tích của hai ma trận được đề cập ở trên vàmilà hàng thứ i của ma trậnM . (Sản phẩm là sản phẩm vô hướng).

Kích thước lại hình ảnh có thể được nghĩ đến:

u=u/2,v=v/2

Như vậy

u=(1/2)M1PM3Pv=(1/2)M2PM3P

Chuyển đổi trở lại dạng ma trận cho chúng ta:

(0.50000.50001)(ax0u00ayv0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Mà bằng

(0.5ax00.5u000.5ay0.5v0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Để biết thêm thông tin, hãy tham khảo Forsyth , chương 3 - Hiệu chỉnh máy ảnh hình học.


Cảm ơn rất nhiều vì lời giải thích !!! Tôi chỉ không chắc chắn ý của bạn về hệ thống dựa trên zero, tôi đang sử dụng MATLAB, tôi có cần điều chỉnh nào khác không?
matlabit

@matlabit, Nếu bạn đang sử dụng Matlab, bạn nên sử dụng phép chuyển đổi với bạn'= =(bạn-1)/2+1,v'= =(v-1)/2+1, vì nó có lập chỉ mục một dựa trên (Phần tử đầu tiên là 1, không phải 0). Hãy thử tính ma trận liên quan trong trường hợp này. Nếu bạn không cần độ chính xác của pixel phụ, bạn có thể bỏ qua nó và sử dụng công thức tôi đã đưa cho bạn.
Andrey Rubshtein

8

Andrey đã đề cập rằng giải pháp của anh ta giả sử 0 được chuyển thành 0. Nếu bạn đang sử dụng tọa độ pixel thì điều này có thể không đúng khi bạn thay đổi kích thước hình ảnh. Giả định duy nhất bạn thực sự cần thực hiện là việc chuyển đổi hình ảnh của bạn có thể được biểu diễn bằng ma trận 3x3 (như đã chứng minh). Để cập nhật ma trận máy ảnh của bạn, bạn có thể chỉ cần đặt trước nó bằng ma trận đại diện cho chuyển đổi hình ảnh của bạn.

[new_camera_matrix] = [image_transform]*[old_camera_matrix]

Ví dụ: giả sử bạn cần thay đổi độ phân giải của hình ảnh theo một yếu tố 2n and you are using 0 indexed pixel coordinates. Your coordinates are transformed by the relationships

x=2n(x+.5).5

y=2n(y+.5).5

this can be represented by the matrix

(2n02n1.502n2n1.5001)

so your final camera matrix would be

(2n02n1.502n2n1.5001)(ax0u00ayv0001)


Could you please elaborate why you add .5 and then subtract .5? Does 0.5 apply only to scaling w/ a factor 2n? Nếu không, làm thế nào để tính số pixel phụ đó?
Gurumonster

1
Tôi nghĩ vấn đề là trung tâm của pixel "0, 0" không thực sự ở "0, 0" (= góc trên cùng bên trái của pixel) mà là "0,5, 0,5". Vì vậy, bạn phải tính toán cho phần bù đó trước và sau khi chuyển đổi, và hệ số luôn là 0,5, bất kể hệ số tỷ lệ.
Jan Rüegg

Yup điều đó hoàn toàn chính xác
Búa
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.