2010-05-19 21 views
11

J'ai un problème avec divers paramètres de OpenCV utilisés pour l'étalonnage de la caméra. Le problème est que trois sources différentes d'information sur les formules de distorsion d'image donnent apparemment trois description non équivalent des paramètres et des équations impliquées:Pourquoi y a-t-il 3 formules d'étalonnage de caméra OpenCV contradictoires?

(1) Dans leur livre « Learning OpenCV ... » Bradski et Kaehler écrire au sujet de l'objectif distorsion (page 376):

xcorrected = x * (1 + k1 * r^2 + k2 * r^4 + k3 * r^6) + [ 2 * p1 * x * y + p2 * (r^2 + 2 * x^2) ], 

ycorrected = y * (1 + k1 * r^2 + k2 * r^4 + k3 * r^6) + [ p1 * (r^2 + 2 * y^2) + 2 * p2 * x * y ], 

où r = sqrt (x^2 + y^2).

assumably, (x, y) sont les coordonnées de pixels dans l'image capturée sans correction correspondant à des objets points du monde de coordonnées (X, Y, Z), un appareil photo-trame référencée, pour lequel

xcorrected = fx * (X/Z) + cx and  ycorrected = fy * (Y/Z) + cy, 

où fx, fy, cx et cy sont les paramètres intrinsèques de la caméra. Ainsi, ayant (x, y) d'une image capturée, nous pouvons obtenir les coordonnées désirées (xcorrected, ycorrected) pour produire une image non déformée de la scène mondiale capturée en appliquant les deux premières expressions de correction ci-dessus.

Mais ...

(2) La situation se complique quand nous regardons OpenCV 2.0 entrée C sous la référence d'étalonnage de l'appareil photo et la section Reconstruction 3D. Pour faciliter la comparaison, nous commençons par exprimer toutes les coordonnées du point du monde (X, Y, Z) par rapport au cadre de référence de la caméra, comme dans # 1. Par conséquent, la matrice de transformation [R | t] est sans importance.

Dans la référence C, il est estimé que:

x' = X/Z, 

y' = Y/Z, 

x'' = x' * (1 + k1 * r'^2 + k2 * r'^4 + k3 * r'^6) + [ 2 * p1 * x' * y' + p2 * (r'^2 + 2 * x'^2) ], 

y'' = y' * (1 + k1 * r'^2 + k2 * r'^4 + k3 * r'^6) + [ p1 * (r'^2 + 2 * y'^2) + 2 * p2 * x' * y' ], 

où r »= sqrt (x '^ 2 + y^2), et enfin que

u = fx * x'' + cx, 

v = fy * y'' + cy. 

Comme une peut voir que ces expressions ne sont pas équivalentes à celles présentées en # 1, avec pour résultat que les deux ensembles de coordonnées corrigées (xcorrected, ycorrected) et (u, v) ne sont pas identiques. Pourquoi la contradiction? Il me semble que le premier ensemble a plus de sens car je peux attacher une signification physique à chaque x et y, alors que je ne trouve aucune signification physique dans x '= X/Z et y' = Y/Z lorsque la caméra focal la longueur n'est pas exactement 1. De plus, on ne peut pas calculer x 'et y' car on ne sait pas (X, Y, Z).

(3) Malheureusement, les choses deviennent encore plus trouble quand on se réfère aux écrits dans Intel Open Source Computer Vision Library Lens section de manuel de référence de distorsion (page 6-4), qui stipule en partie:

« Soit (u, v) sont de vraies coordonnées d'images de pixels, c'est-à-dire coordonnées avec une projection idéale, et (u, v) correspondent à des coordonnées d'image réelles observées (déformées) De même, (x, y) sont idéales (sans distorsion) . et (x, y) sont réels (déformée) image coordonnées physiques prenant en compte deux termes d'expansion donne les éléments suivants:

x ̃ = x * (1 + k1 * r^2 + k2 * r^4) + [ 2 p1 * x * y + p2 * (r^2 + 2 * x^2) ] 

y ̃ = y * (1 + k1 * r^2 + k2 * r^4 ] + [ 2 p2 * x * y + p2 * (r^2 + 2 * y^2) ], 

où r = sqrt (x^2 + y^2). ...

« Parce que u = cx + fx * u et v = cy + fy * v ... le système résultant peut être réécrite comme suit:

u ̃ = u + (u – cx) * [ k1 * r^2 + k2 * r^4 + 2 * p1 * y + p2 * (r^2/x + 2 * x) ] 

v ̃ = v + (v – cy) * [ k1 * r^2 + k2 * r^4 + 2 * p2 * x + p1 * (r^2/y + 2 * y) ] 

Les dernières relations sont utilisées pour undistort images de l'appareil photo." Eh bien, il semblerait que les expressions impliquant x et y coïncident avec les deux expressions données en haut de cette écriture impliquant xcorrected et ycorrected. Cependant, x et y ne se réfèrent pas aux coordonnées corrigées, selon la description donnée. Je ne comprends pas la distinction entre la signification des coordonnées (x, y) et (u, v), ou d'ailleurs, entre les paires (x, y) et (u, v). De leurs descriptions, il apparaît que leur seule distinction est que (x, y) et (x, y) se réfèrent à des coordonnées 'physiques' alors que (u, v) et (u, v) ne le font pas. Quelle est cette distinction? Ne sont-ils pas toutes les coordonnées physiques? Je suis perdu!

Merci pour toute contribution!

Répondre

2

Il n'existe pas de formule unique pour l'étalonnage de la caméra, elles sont toutes valides. Remarquez que le premier contient les constantes K1, K2 & K3 pour r^2, r^4 & r^6, et les deux autres n'ont de constantes que pour r^2 et r^4? C'est parce qu'ils sont tous des modèles approximatifs. Le premier est susceptible d'être plus précis puisqu'il a plus de paramètres.

Chaque fois que vous voyez:

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

il est probablement prudent de supposer x = (la coordonnée x pixel) - (centre de la caméra en pixels) puisque r signifie généralement rayon du centre.

Qu'essayez-vous de faire d'ailleurs? Estimez les paramètres de la caméra, corrigez-vous la distorsion de l'objectif ou les deux?

+0

Merci Doug pour votre contribution. Malheureusement, je n'aurais peut-être pas posé la question assez clairement car il semble que vous manquiez le point de discorde entre les trois formulations. Ce n'est pas la différence de nombre de termes utilisés dans les diverses approximations qui est préoccupante ici, mais plutôt le fait - du moins tel que je le conçois - que les trois formulations différentes ne sont pas mathématiquement équivalentes (même en supposant ils ont tous le même nombre de termes dans leur approximation.) J'essaye d'écrire un programme qui corrige les distorsions de caméra données fx, fy, cx et cy. John – John