Comment calculer l'angle d'un objet devant ma caméra? La résolution de mon appareil photo est de 1280x1024, la distance focale de mon objectif est de 8 mm et la taille de pixel de chaque pixel sur le CMOS est de 4,8 micromètres. Il doit sûrement être possible de calculer l'angle à partir de cela. J'ai également calculé la distance de l'objet à la caméra et tout est sur un seul niveau. Donc, seule la coordonnée X est intéressante, non?

J'utilise OpenCV et Python pour le traitement.

Mon idée était d'utiliser la distance focale de l'objectif en combinaison avec le décalage X de l'objet détecté depuis le milieu du capteur, mais j'obtiens des angles étranges à partir de cela.

Voici le code pour l'estimation de l'angle:

d'abord la coordonnée du point X, deuxièmement la largeur de l'ensemble du capteur (1280 pixels * 4,8 um) en mm, la troisième la distance focale en mm.

angle = (pointInterpolatedX * 6.144) / 8

Quelqu'un pourrait-il m'aider ici? Merci!

De plus, j'ai jeté un œil à ce sujet ici, mais je peux ne le comprends pas bien. J'ai beaucoup plus d'informations sur mon appareil photo et mon objet ne peut se déplacer qu'en 2 Dimensions et non en trois. Il pourrait donc y avoir un moyen astucieux d'estimer sa position au sol devant la caméra. OpenCV a-t-il une fonction que je pourrais utiliser pour cela?

4
MarviB 9 mars 2019 à 21:42

2 réponses

Meilleure réponse

Pour obtenir une réelle précision, vous devrez calibrer la caméra. Ce qui suit suffit pour une première approximation.

L'image ci-dessous représente les systèmes de coordonnées image (Xi, Yi) et caméra (Xc, Yc, Zc) que j'utiliserai dans cette réponse - ce sont ceux utilisés par OpenCV. Il montre également deux points d'image p1 et p2 , qui peuvent être les limites de l'image de votre objet d'intérêt, et les rayons correspondants r1 et r2 en les projetant au centre de la caméra.

Image axes

Tout d'abord, convertissons votre objectif en pixels pour simplifier les calculs. À un pas de 4,8 um, la largeur de votre capteur est de 4,8 * 1280 um = 6,14 mm. Donc, en proportion, f_pix: 8 mm = 1280 pix: 6,14 mm, donc f_pix = 1667 pixels. Nous pouvons maintenant écrire la matrice de caméra sténopé la plus simple possible, qui suppose que l'axe focal de la caméra est orthogonal à l'image et l'intersecte au centre de l'image. En notation numpy:

K = np.array([[1667, 0, 640], [0, 1667, 512], [0, 0, 1]])

Compte tenu de cette matrice et de tout point 3D P = (X, Y, Z) dans les coordonnées de la caméra, les coordonnées de l'image (x, y) de sa projection sur l'image sont calculé comme:

p = K.dot(P)
x, y = p[0]/p[2], p[1]/p[2]

Inversement, étant donné une paire de coordonnées de pixels (x, y) , le rayon 3D r projetant ce pixel dans l'espace 3D est donné par:

Ki = np.linalg.inv(K)
r = Ki.dot([x, y, 1.0])

Il s'agit d'un "rayon" dans le sens où tous les points 3D R = s * r , obtenus en le multipliant par un nombre arbitraire s , se trouveront sur la même ligne en passant par le centre de la caméra et le pixel (x, y) .

Par conséquent, étant donné les points de votre image limite p1 = (x1, y1) et p2 = (x2, y2) , vous pouvez calculer comme ci-dessus les rayons r1 et r2 en les projetant dans l'espace 3D. L'angle entre eux est facilement calculé à partir de la formule du produit scalaire:

cos_angle = r1.dot(r2) / (np.linalg.norm(r1) * np.linalg.norm(r2))
angle_radians = np.acos(cos_angle)

Pour réitérer, les formules ci-dessus ne sont qu'une première approximation. Un vrai appareil photo aura une distorsion de lentille non linéaire que vous devrez corriger pour obtenir des résultats précis, et aura un axe focal légèrement décentré par rapport à l'image. Tous ces problèmes sont résolus en calibrant la caméra.

4
Francesco Callari 10 mars 2019 à 23:29

Non, vous devez connaître l'angle de votre appareil photo prendre un rapporteur et le mesurer que vous pouvez utiliser quelque chose comme ça

x,y=my_coordinates
angle_per_pix=my_cam_angle/1280
angle_vertical=(x-640)*angle_per_pix #-640 beacuse you want angle between middle of camera
angle_horizontal=(x-512)*angle_per_pix

Exemple pour my_cam_angle:

cam view

angle

0
Rifat Alptekin Çetin 9 mars 2019 à 19:10