2013-07-06 11 views
10

Chciałbym wiedzieć, w jaki sposób mogę obliczyć kąt niektórych pikseli na zdjęciu w stosunku do kamery internetowej, z której korzystam. Jestem nowy w tego typu sprawach i używam kamery internetowej. Zasadniczo robię zdjęcie, przetwarzam je i otrzymuję wartość piksela na obrazie, którego szukam. Następnie muszę jakoś przekształcić tę wartość pikseli w jakąś znaczącą ilość - muszę znaleźć linię/wektor, który przechodzi przez piksel i kamerę. Nie potrzebuję wielkości, tylko fazy.OpenCV: Oblicz kąt między kamerą a pikselem.

Jak to zrobić? Czy konieczna jest kalibracja kamery? Czytałem trochę o tym, ale nie jestem pewien.

Dzięki

+2

Aby móc to zrobić, trzeba znać odległość obiektu odpowiadającą pikselowi i pole widzenia kamery. –

+0

Dobra, czy masz jakieś wskazówki, w jaki sposób mogę rozwiązać mój problem.Zasadniczo szukam konkretnego obiektu koloru. Znajduję współrzędne pikseli, które najlepiej pasują do koloru, którego szukam, a następnie muszę mieć możliwość określenia kierunku, w którym znajduje się obiekt ... Czy nie jest to możliwe bez głębokości? Pomyślałbym, że będę w stanie uzyskać pewne łożysko ze współrzędnych pikseli ... –

+0

Narysuj diagram sytuacji. Masz trójkąt prostokątny, którego wierzchołkami są (A) obiekt, (B) kamera i (C) punkt w środku obrazu, ale w głębi obiektu. Jak zamierzasz obliczyć kąt ABC? –

Odpowiedz

7

Nie trzeba znać odległość do obiektu, tylko rozdzielczość i kąt widzenia kamery.

Obliczanie kąta wymaga jedynie prostej interpolacji liniowej. Załóżmy na przykład, że kamera ma rozdzielczość 1920 x 1080, która obejmuje kąt widzenia 45 stopni po przekątnej.

W tym przypadku sqrt (1920 + 1080) daje 2292.19 pikseli wzdłuż przekątnej. Oznacza to, że każdy piksel reprezentuje 45/2292.19 = .0153994 stopni.

Oblicz odległość od środka (w pikselach), pomnóż przez .0153994, a masz jego kąt od środka (dla tej kamery - dla Ciebie oczywiście będziesz musiał użyć jej rozdzielczości i kąta widzenia).

Oczywiście jest to trochę przybliżone - jego dokładność zależy od stopnia zniekształcenia obiektywu. Dzięki obiektywowi zmiennoogniskowemu (szczególnie szerszemu kątowi) możesz ogólnie liczyć, że jest dość wysoki. W przypadku obiektywów o stałej ogniskowej (zwłaszcza jeśli nie obejmuje ona kąta większego niż 90 stopni), zwykle będzie to dość niska wartość.

Jeśli chcesz poprawić dokładność, możesz rozpocząć od zrobienia zdjęcia płaskiego prostokąta z liniami prostymi tuż pod kątem kamery, a następnie obliczyć zniekształcenie na podstawie odchylenia od idealnie prostej w wynikowym obrazie. . Jeśli pracujesz z bardzo szerokokątnym obiektywem, może to być prawie niezbędne. Z obiektywem o mniejszym kącie widzenia (szczególnie, jak już wspomniano, jeśli ma stałą długość ogniskowej), rzadko jest to warte zachodu (takie obiektywy często mają tylko ułamek procenta zniekształceń).

+0

Dziękuję, to jest bardzo pomocne. Czy uważasz, że "kalibracja kamery" byłaby konieczna/warto? –

+0

@ user968243: Wierzę, że kalibracja kamery OpenCV ma na celu pomiar zniekształceń, więc jest to dokładnie to, o czym mówi ostatni akapit odpowiedzi. Jego użyteczność zależeć będzie od poziomu zniekształcenia obiektywu, którego nie znam. –

+0

Odpowiedź to tylko przybliżenie pierwszego rzędu. Możesz łatwo uzyskać znacznie dokładniejszą odpowiedź, kalibrując kamerę. Jest to szczególnie ważne w przypadku obiektywów o szerszym kącie widzenia (> 90 stopni FOV), które zwykle wykazują znaczne zniekształcenie nieliniowe. –

11

przepisu:

1 - Kalibracja aparatu uzyskania matrycy kamery K i zniekształcenia parametrów D. OpenCV to odbywa się w sposób opisany w niniejszym tutorial.

2 - Usuń zniekształcenie nieliniowe z pozycji pikseli, które Cię interesują. W OpenCV odbywa się za pomocą procedury undistortPoints, bez przekazywania argumentów R i P.

3 - Powrót - rzutowanie pikseli będących przedmiotem zainteresowania na promienie (wektory jednostek z ogonem w środku kamery) we współrzędnych 3D kamery, poprzez pomnożenie ich pozycje pikseli w jednorodnych współrzędnych są razy odwrotne do macierzy kamery.

4 - Wymagany kąt to kąt pomiędzy powyższymi wektorami i (0, 0, 1), wektor powiązany z osią ostrości kamery.

+0

Witam, chciałbym przybyć, aby z piksela P ustawić wektor łożyska. Który jest wektorem jednostkowym, który biegnie od środka kamery do obiektu określonego przez piksel. Aby to zrobić, powinienem dotrzeć do punktu 3 opisu. Camera_matrix to matryca 3x3, która na przykład wychodzi z kalibracji kamery. Czy to wszystko prawda? Z góry dziękuję – kalmanIsAGameChanger