Làm thế nào tôi có thể lập trình cho một máy ảnh biết nơi để chỉ?


8

Tôi không có một máy ảnh cụ thể trong tâm trí ngay bây giờ, tôi chỉ tò mò về cách thực hiện, lập trình / toán học.

Tôi có một không gian 3D, một hình chữ nhật, với một camera ở một góc nhìn vào trong.
Tôi có một đối tượng chuyển động trong hình chữ nhật đó đang truyền tọa độ (x, y, z) của vị trí hiện tại của nó.
Tôi muốn lấy các tọa độ đó và dịch chúng thành các hướng dẫn cho máy ảnh chỉ vào vị trí đó.
Bản dịch này thường được thực hiện như thế nào?


Bạn có thể muốn xem cách các nhà phát triển trò chơi xử lý các camera trong trò chơi của họ. Đó là cùng một nguyên tắc và họ đã phải đối phó với mọi thứ dưới ánh mặt trời, có thể nói như vậy.
Harabeck

Có thể đáng chú ý rằng đối tượng không phải truyền tọa độ của nó trong không gian 3D theo nghĩa đen, nhưng thay vào đó, có thể truyền bằng cách ở trong FOV của máy ảnh. Sau đó, bạn sẽ sử dụng nhận dạng mẫu để tìm vị trí trong khung của đối tượng và sau đó dịch chuyển camera sang chính giữa đối tượng (hoặc xác định một vectơ chuyển động trong 2D bằng cách theo dõi sự thay đổi vị trí trên nhiều khung hình và di chuyển theo hướng đó) . Ví dụ, camera PTZ của tôi ở hiên sẽ quét mái hiên tìm kiếm chuyển động không phải do chuyển động lia máy, sau đó khóa và theo dõi vật phẩm chuyển động cho đến khi chuyển động dừng lại.
dannysauer

Trường hợp sử dụng của tôi là một hệ thống phân tích thể thao, mỗi người chơi đang đeo một thẻ truyền vị trí hiện tại, tốc độ, vv trên sân. Vì vậy, chúng tôi đã có thông tin vị trí. Tôi chắc chắn sẽ xem xét một mô hình công nhận mặc dù. Âm thanh hữu ích.
bot_bot

Câu trả lời:


10

Lượng giác!

Máy ảnh của tôi là DLink 5020-L và có các lệnh pan / tilt có thể được cung cấp thông qua API . Nó cũng có các vị trí được xác định trước để đặt và cũng có thể được kích hoạt thông qua API

Tiền khởi đầu

  • Xác định vị trí của máy ảnh của bạn với Pan 0 ° và Nghiêng 0 ° trong tham chiếu của bạn => chúng tôi sẽ gọi vị trí này Position 1

Trong đó

  • Di chuyển máy ảnh của bạn đến Position 1
  • Lưu trữ ở đâu đó pan / tilt của máy ảnh của bạn, trong các biến được khởi tạo 0 hoặc thông qua API của bạn

Nhìn vào đối tượng

  • Xác định vị trí đối tượng của bạn trong hai mặt phẳng, các mặt phẳng X, Y và Y, Z
  • Bạn có thể lấy góc pan (trái / phải) (công thức toán học omg trong IoT SE!)

$$ \ arctan \ bigg (\ frac {y} {x} \ bigg) $$

  • Bạn có thể nhận được góc nghiêng (lên / xuống)

$$ \ arctan \ bigg (\ frac {z} {y} \ bigg) $$

  • Đừng quên lưu / cập nhật giá trị pan / tilt mới vì bạn có thể làm việc với chuyển động tương đối ...

Bạn có thể phủ nhận các kết quả trước đó tùy thuộc vào cách đặt máy ảnh của bạn

(Tôi sẽ thêm một số sơ đồ khi tôi có thời gian)


2
Bị đánh bại bởi @hardillb;) Và anh ta có công thức tìm kiếm tốt hơn ...
Goufalite

2
Thật không may, hỗ trợ LaTeX không có sẵn trên trang web này. Bạn có thể xuất nó từ một nơi nào đó như CodeCogs thành một hình ảnh thay thế nếu bạn muốn. (Tôi đã làm điều này cho bạn; vui lòng chỉnh sửa theo yêu cầu hoặc xóa nó nếu bạn không muốn!)
Aurora0001

Cảm ơn bạn cả sự giúp đỡ của bạn. Điều này thật đúng với gì mà tôi đã tìm kiếm.
bot_bot

Tôi nghĩ rằng bạn đã quên tính đến thực tế là arctan cho góc nghiêng phải liên quan đến thành phần z so với cạnh huyền: đặt nó trên thành phần y có thể nâng / hạ máy ảnh của bạn không đủ vì máy ảnh sẽ hoạt động chỉ dọc theo cạnh huyền của một tam giác vuông giữa thành phần y và thành phần x, không dọc theo trục y. Sửa tôi nếu tôi sai. :) Câu trả lời tuyệt vời, mặc dù.
nặc

@ nặc danh2 đó cũng là suy nghĩ của tôi Tôi không nghĩ bất kỳ câu trả lời nào được đưa ra là thực sự chính xác nhưng tôi không có băng thông để thực sự hiển thị ngay bây giờ - có vẻ như bạn cần hai hình tam giác và cả ba tọa độ để có được biến (pan hoặc tilt). Bạn có thể tự chứng minh điều này bằng cách hình dung hai ví dụ cực đoan khác nhau: x, y, z là 1,1.999 sẽ cho nhiều chảo khác nhau và độ nghiêng khác nhau nhiều hơn 1,1,1. Câu trả lời của Goufalite đưa ra cùng một chảo cho cả hai.
dwizum

6

Những câu trả lời tuyệt vời đã có, tôi chỉ muốn thêm một vài điều khác mà bạn nên xem xét. Giống như hardlib và Goufalite đã đề cập, cách để làm điều này là lượng giác. Tôi đã vẽ một mô tả 2 chiều về máy ảnh và đối tượng IoT:

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

Như bạn có thể thấy, trường nhìn của máy ảnh sẽ lớn hơn đối tượng - nếu không ở trong phạm vi gần, khi đối tượng di chuyển xa hơn.

Bây giờ, bạn có thể muốn máy ảnh luôn tập trung vào đối tượng. Trong trường hợp đó, bạn chỉ cần thực hiện các phép tính mà hardlib đã tham chiếu:

ϴ = arctan(y/x)

... sẽ là góc ngược chiều kim đồng hồ từ trục x, theo quy ước. Bạn cũng sẽ cần góc xa từ cấp độ:

α = arctan(z / ((y^2+x^2)^1/2))

Rõ ràng, bạn sẽ phải tính toán dựa trên vị trí camera ở điểm gốc ở cả ba trục.

Mặt khác, bạn có thể không muốn làm cho máy ảnh di chuyển nhiều hơn mức cần thiết, nghĩa là làm cho máy ảnh chỉ di chuyển một khi đối tượng dường như sắp di chuyển ra khỏi khung hình. Trong trường hợp đó, có lẽ bạn sẽ muốn có một biến "áp suất", điều này sẽ khiến máy ảnh có nhiều khả năng thay đổi góc của nó dựa trên mức độ gần của vật thể với cạnh của khung hình.

Nếu bạn đi theo tuyến đường đó, bạn sẽ cần biết góc nhìn của camera trong cả hai trường nhìn, để bạn có thể xác định vị trí của đối tượng so với trường nhìn của camera.


Điều đó thật tuyệt! Cảm ơn, hiện tại tôi sẽ muốn giữ đối tượng tập trung trong trường nhìn của camera.
bot_bot

2
Khi tôi xoay / nghiêng máy ảnh của tôi, tôi có độ trễ (~ 0,5 giây) giữa mỗi đơn hàng, hãy cẩn thận khi di chuyển máy ảnh của bạn
Goufalite

Điểm tốt - đó chắc chắn là một cái gì đó để xem xét.
nặc

5

Điều này thường được thực hiện với lượng giác cơ bản .

Bắt đầu bằng cách làm việc trên một mặt phẳng 2d duy nhất với máy ảnh ở gốc (0,0) và đối tượng tại (x, y)

Cho rằng khoảng cách x sẽ là cạnh kề của tam giác và khoảng cách y sẽ ngược lại với bạn:

tan (góc) = y / x

vì vậy góc pan có thể được tìm thấy với

Góc = invTan (y / x)

Bạn cũng có thể tìm ra khoảng cách đường thẳng (cạnh huyền) giữa máy ảnh và đối tượng với:

h ^ 2 = x ^ 2 + y ^ 2

Tặng:

h = sqrt (x ^ 2 + y ^ 2)

Bây giờ bạn có thể sử dụng khoảng cách h với chiều cao z để tính góc nghiêng theo cùng một cách.

Khi bạn có các góc, bạn có thể cung cấp các góc này cho những gì đang điều khiển pan / tilt trên máy ảnh.

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.