Comprendre le principe de l'étalonnage de la caméra en termes simples

Remarque importante : cet article est compilé à partir d'informations en ligne. Il enregistre uniquement le processus d'apprentissage des points de connaissances pertinents par le blogueur et n'a pas été supprimé.

1. Documents de référence

Compte public WeChat : Chronique Computer Vision Life : #cameracalibration

Calibrage de la caméra
Calibrage de la caméra et reconstruction 3D
Méthode de calibrage de Zhang Zhengyou - Notes d'étude complètes - Du principe à la pratique pratique
Les principes de calibrage de la caméra et la relation entre les quatre systèmes de coordonnées

2. Introduction à l'étalonnage de la caméra

1. Projection en perspective

En utilisant la méthode de projection centrale, l'objet est projeté sur la surface de projection, obtenant ainsi une image de projection unilatérale plus proche de l'effet visuel, qui est une méthode d'imagerie où l'on voit le paysage de près et de loin .

2. Le concept d'étalonnage de la caméra

En termes simples, l'étalonnage de la caméra est le processus de conversion du système de coordonnées mondial au système de coordonnées de pixels. Ce processus comprend deux étapes : l'établissement d'un modèle géométrique d'imagerie de la caméra et la correction de la distorsion de l'objectif.

Établir le modèle géométrique d'imagerie de la caméra : établir le modèle géométrique de l'objet en cours de cartographie du monde tridimensionnel au plan d'imagerie de la caméra. La partie la plus critique consiste à obtenir les paramètres internes et externes de la caméra .

Correction de la distorsion de l'objectif : En raison du processus de fabrication de l'objectif, diverses formes de distorsion se produisent. Afin de supprimer la distorsion, le coefficient de distorsion est calculé et utilisé pour corriger l'aberration afin que l'image après imagerie soit cohérente avec la scène du monde réel.

3. Quatre systèmes de coordonnées

Système de coordonnées mondial : Un système de coordonnées défini par l'utilisateur du monde tridimensionnel, introduit pour décrire la position de l'objet cible dans le monde réel. L'unité est le mètre et le système de coordonnées est ( X w , Y w , Z w ) (X_w,Y_w,Z_w)( Xw,Ouiw,Zw)

Système de coordonnées de la caméra : Le système de coordonnées établi sur la caméra est défini pour décrire la position de l'objet du point de vue de la caméra, et sert de lien intermédiaire entre le système de coordonnées mondial et le système de coordonnées image/pixel. L'unité est le mètre. Généralement, l'axe optique de la caméra est l'axe Z et le système de coordonnées est (X c , Y c , Z c ) (X_c, Y_c, Z_c)( Xc,Ouic,Zc)

Système de coordonnées physiques de l'image (système de coordonnées d'image) : Introduit pour décrire la relation de projection et de transmission d'un objet du système de coordonnées de la caméra au système de coordonnées de l'image pendant le processus d'imagerie, afin de faciliter davantage l'obtention des coordonnées dans le système de coordonnées de pixels. L'unité est le millimètre. L'origine des coordonnées est le point d'intersection de l'axe optique de la caméra et du système de coordonnées physiques de l'image. Le système de coordonnées est (x, y) (x, y)( x ,oui )

Système de coordonnées de pixels de l'image (système de coordonnées de pixels) : Introduit pour décrire les coordonnées du point image de l'objet sur l'image numérique (photo), c'est le système de coordonnées dans lequel se trouvent les informations que nous lisons réellement depuis la caméra. L'unité est le pixel, l'origine des coordonnées est dans le coin supérieur gauche et le système de coordonnées est (u, v) (u,v)( tu ,v )

La relation entre les quatre systèmes de coordonnées est présentée dans la figure ci-dessous :
insérer la description de l'image ici

Parmi eux, l'axe Z du système de coordonnées de la caméra coïncide avec l'axe optique, est perpendiculaire au plan du système de coordonnées de l'image et passe par l'origine du système de coordonnées de l'image. La distance entre le système de coordonnées de la caméra et les coordonnées de l'image Le système est la distance focale f (c'est-à-dire l'origine du système de coordonnées de l'image et le chevauchement de la mise au point). Le plan uv du système de coordonnées des pixels coïncide avec le plan xy du système de coordonnées de l'image, mais l'origine du système de coordonnées des pixels est située dans le coin supérieur gauche de la figure (la raison de cette définition est de lire et d'écrire à partir du première adresse des informations stockées).

4. Conversion des quatre systèmes de coordonnées

insérer la description de l'image ici

4.1 Système de coordonnées mondial vs système de coordonnées de la caméra

Le système de coordonnées mondial est converti en système de coordonnées de la caméra. La conversion entre ces deux systèmes de coordonnées appartient au mouvement du corps rigide . L'objet change uniquement la position spatiale (translation) et l'orientation (rotation) dans les deux systèmes de coordonnées, mais ne change pas sa forme. La relation de conversion entre elles peut être complétée par la matrice de translation T et la matrice de rotation R. Ces deux matrices reflètent la relation de conversion entre le système de coordonnées mondial et le système de coordonnées de la caméra, collectivement appelées matrice de paramètres externes L w L_wLw. Après avoir obtenu la matrice des paramètres externes, un point dans le système de coordonnées mondial est connu, et la position de ce point dans le système de coordonnées de la caméra peut être obtenue en convertissant la relation.

La matrice de transformation est représentée par un repère homogène composé d'une matrice de rotation et d'un vecteur de translation :
[ x C y C z C 1 ] = [ R t 0 3 T 1 ] [ x W y W z W 1 ] = [ r 1 r 2 r 3 t ] [ x W y W 0 1 ] = [ r 1 r 2 t ] [ x W y W 1 ] \left[\begin{array}{c}x_{C}\\y_ {C} \\z_{C}\\1\end{array}\right]=\left[\begin{array}{cc}R&t\\0_{3}^{T}&1\end{array}\ droite]\ gauche[\begin{array}{c}x_{W}\\y_{W}\\z_{W}\\1\end{array}\right]=\left[\begin{array}{ cc}r_ {1}&r_{2}&r_{3}&t\end{array}\right]\left[\begin{array}{c}x_{W}\\y_{W}\\0\\1 \end{ array}\right]=\left[\begin{array}{cc}r_{1}&r_{2}&t\end{array}\right]\left[\begin{array}{c}x_{ W}\ \y_{W}\\1\end{array}\right] XCouiCzC1 =[R.03Tt1] XWouiWzW1 =[r1r2r3t] XWouiW01 =[r1r2t] XWouiW1
Parmi eux, R est la matrice de rotation et t est le vecteur de translation. Supposons que dans le système de coordonnées mondial, le plan où se trouve le point objet passe par l'origine du système de coordonnées mondial et que Z w = 0 Z_w=0Zw=L'axe 0 est vertical, c'est-à-dire le plan de l'échiquier etX w − Y w X_w - Y_wXwOuiwLes plans se chevauchent pour faciliter les calculs ultérieurs. Parmi eux, la matrice de changement est :
[ R t 0 3 T 1 ] \begin{bmatrix}R&t\\0_3^T&1\end{bmatrix}[R.03Tt1]
La figure ci-dessous montre le processus de conversion du système de coordonnées mondial en système de coordonnées de la caméra avec R et t.
insérer la description de l'image ici

4.2 Système de coordonnées de la caméra vs système de coordonnées physiques de l'image (pas de distorsion)

La conversion du système de coordonnées de la caméra en système de coordonnées physiques de l'image consiste à convertir le système de coordonnées tridimensionnelles en un système de coordonnées bidimensionnelles, c'est-à-dire le processus de perspective de projection. Comme le montre la figure ci-dessous, le processus d'imagerie par sténopé : la surface du sténopé (système de coordonnées de la caméra) se situe entre le plan de l'image (système de coordonnées physiques de l'image) et le plan du point objet (plan de l'échiquier), et l'image formée est une image réelle inversée . .
insérer la description de l'image ici

mais,Afin de décrire plus facilement en mathématiques, les positions du système de coordonnées de la caméra et du système de coordonnées physiques de l'image sont inversées (il n'y a pas de signification physique réelle, juste pour faciliter le calcul), devient comme indiqué dans la figure ci-dessous :
insérer la description de l'image ici
insérer la description de l'image ici

En supposant qu'il existe un point M dans le repère de la caméra, selon le principe des triangles semblables, les coordonnées du point d'imagerie P dans le repère physique de l'image (sans distorsion) sont : xp = fx M z M , yp =
fy M z M \mathrm{x }_{p}=f\frac{x_{M}}{z_{M}},y_{p}=f\frac{y_{M}}{z_{M}}Xp=FzMXM,ouip=FzMouiM
Divisons et conquérons l'équation :
z M [ xpyp 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ x M y M z M 1 ] = [ f 0 0 0 f 0 0 0 1 ] [ 1 0 0 0 0 1 0 0 0 0 1 0 ] [ x M y M z M 1 ] z_{M}\left[\begin{array}{c}{x_{p}}\\ {y_{p }}\\{1}\\\end{array}\right]=\left[\begin{array}{ccc}{f}&{0}&{0}&{0}\\ {0}& {f}&{0}&{0}\\{0}&{0}&{1}&{0}\\\end{array}\right]\left[\begin{array} {c}{ x_{\mathrm{M}}}\\{y_{\mathrm{M}}}\\{z_{\mathrm{M}}}\\{1}\\\end{array}\ right]=\ gauche[\begin{array}{ccc}{f}&{0}&{0}\\{0}&{f}&{0}\\{0}&{0}&{1 }\\\ end{array}\right]\left[\begin{array}{ccc}{1}&{0}&{0}&{0}\\{0}&{1}&{0} &{0} \\{0}&{0}&{1}&{0}\\\end{array}\right]\left[\begin{array}{cc}{x_{\mathrm{M} }}\\ {y_{\mathrm{M}}}\\{z_{\mathrm{M}}}\\{1}\\\end{array}\right]zM Xpouip1 = F000F0001000 XMouiMzM1 = F000F0001 100010001000 XMouiMzM1

4.3 Système de coordonnées de la caméra vs système de coordonnées physiques de l'image (avec distorsion)

Veuillez vous référer au chapitre : Modèle de distorsion de la caméra

4.4 Système de coordonnées physiques de l'image par rapport au système de coordonnées des pixels de l'image

Prenons un exemple frappant pour illustrer la différence entre le système de coordonnées physiques de l'image et le système de coordonnées des pixels de l'image. Le système de coordonnées physiques est un concept continu, et il est mesuré en millimètres, tout comme la valeur de coordonnée spécifique d'un certain public dans un cinéma (3.4, 5.9) ; tandis que le système de coordonnées de pixels est un concept discret, et il est mesuré en pixels. , avant d'être des coordonnées à valeur entière, tout comme la position d'un certain public dans une salle de cinéma (troisième ligne, sixième colonne). De plus, il convient de noter que les positions d'origine des deux systèmes de coordonnées ne sont pas les mêmes,L'origine du système de coordonnées physiques est l'intersection de l'axe optique de la caméra et du système de coordonnées physiques de l'image, généralement appelé point principal ; tandis que le système de coordonnées des pixels prend le coin supérieur gauche de l'image des pixels comme origine.

Étant donné que l'origine définie du système de coordonnées physiques de l'image ne coïncide pas avec l'origine du système de coordonnées physiques de l'image, on suppose que les coordonnées de l'origine du système de coordonnées physiques de l'image dans le système de coordonnées physiques de l'image sont (u 0, v 0 ) (u_0, v_0)( tu0,v0) , les dimensions de chaque pixel dans les directions des axes x et y du système de coordonnées physiques de l'image sont :dx, dy d_x, d_ydxoui, et les coordonnées du point image dans le système de coordonnées physiques de l'image sont (xc, yc) (x_c, y_c)( xc,ouic) , les coordonnées du point souhaité dans le système de coordonnées de l'image sont :
u = xcdx + u 0 , v = ycdy + v 0 u=\frac{x_{c}}{d_{x}}+u_{0}, \mathbf{v}=\frac{y_{c}}{d_{y}}+\mathbf{v}_{0}toi=dxXc+toi0,v=douiouic+v0
La forme de transformation en un système de coordonnées homogène est :
[ u ν 1 ] = [ 1 / dx 0 u 0 0 1 / dyv 0 0 0 1 ] [ xcyc 1 ] \begin{bmatrix}u\\\nu\\1 \end{bmatrix}=\begin{bmatrix}1/d_x&0&u_0\\0&1/d_y&v_0\\0&0&1\end{bmatrix}\begin{bmatrix}x_c\\y_c\\1\end{bmatrix} toin1 = 1/ jx0001/ joui0toi0v01 Xcouic1

5. Modèle de distorsion de la caméra

La distorsion de la lentille est principalement divisée en : distorsion radiale et distorsion tangentielle, ainsi que distorsion de lentille fine, etc., mais elles ne sont pas aussi importantes que la distorsion radiale et la distorsion tangentielle, donc généralement seules la distorsion radiale k et la distorsion tangentielle p sont prises en compte. Un total de 5 paramètres de distorsion (k1, k2, k3, p1 et p2) sont nécessaires pour décrire la distorsion de la lentille, dont la distorsion radiale a 3 paramètres (k1, k2, k3) et la distorsion tangentielle a 2 paramètres (p1, p2).

5.1 Distorsion radiale

La distorsion radiale est causée par le processus de fabrication de la forme du verre. Plus vous vous rapprochez du bord du verre, plus la distorsion radiale devient grave. La figure ci-dessous montre deux types de distorsion radiale : la distorsion en barillet (k<0) et la distorsion en coussinet (k>0).
insérer la description de l'image ici

  • Lorsque k>0, plus r est grand (plus le point est éloigné du centre), plus la distorsion est grande, et plus r est petit, plus la distorsion est petite, ce qui est en forme de coussin.
  • Lorsque k<0, plus r est grand (plus le point est éloigné du centre), plus la distorsion est faible, et plus r est petit, plus la distorsion est grande, en forme de tonneau.

Dans des situations réelles, les premiers termes du développement en série de Taylor à r = 0 sont souvent utilisés pour décrire approximativement la distorsion radiale. La relation de coordonnées avant et après correction de la distorsion radiale est :
{ xdistorted = xp ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) ydistorted = yp ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \begin{cases}\mathbf{x}_{déformé}=x_p(1+k_1r^2+k_2r^4+k_3r^6)\\y_{déformé}=y_p(1+k_1r^2 +k_2r ^4+k_3r^6)\end{cases}{ Xd i s t or t e d=Xp( 1+k1r2+k2r4+k3r6 )ouid i s t or t e d=ouip( 1+k1r2+k2r4+k3r6 )
On voit que, pour la distorsion radiale, il y a trois paramètres de distorsion radiale (k1, k2, K3) à résoudre.

La recherche montre que le paramètre de distorsion radiale choisit généralement 2 ou 3 valeurs k et que de meilleurs résultats peuvent être obtenus. Si plus de k est obtenu, l'impact ne sera pas important et pourra être ignoré, et cela peut également conduire à de mauvais résultats.

5.2 Distorsion tangentielle

La distorsion tangentielle est causée par l'erreur de position d'installation de l'objectif et du CMOS ou CCD. Ainsi, un rectangle est susceptible de devenir un trapèze lorsqu'il est projeté sur le plan d'imagerie en cas de distorsion tangentielle. La distorsion tangentielle nécessite deux paramètres de distorsion supplémentaires (p1 et p2) pour être décrite. La relation de coordonnées avant et après correction est : {
xdistorted = xp + [ 2 p 1 xpyp + p 2 ( r 2 + 2 xp 2 ) ] ydistorted = yp + [ p 1 ( r 2 + 2 yp 2 ) + 2 p 2 xpyp ] \begin{cases}\mathbf{x}_{distorsion}=x_{p}+[2p_{1}x_{p}y_{p } +p_{2}(r^{2}+2{x_{p}}^{2})]\\\mathbf{y}_{déformé}=y_{p}+[p_{1}(r ^ {2}+2{y_{p}}^{2})+2p_{2}x_{p}y_{p}]\end{cases}{ Xd i s t or t e d=Xp+[ 2p _1Xpouip+p2( r2+2x _p2 )]ouid i s t or t e d=ouip+[ p1( r2+2 ansp2 )+14 heures2Xpouip]

6. Paramètres d'étalonnage de la caméra

référence interne

  • Distance focale : fx, fy f_x, f_yFxfoui

  • Coordonnées des pixels du point principal (centre optique) : cx, cy c_x, c_ycxcoui

  • Coefficients de distorsion : k 1 , k 2 , k 3 , p 1 , p 2 k_{1},k_{2},k_{3},p_{1,}p_{2}k1,k2,k3,p1 ,p2

matrice de caméra x = [ fx 0 cx 0 fycy 0 0 1 ] caméra\text{matrix}x=\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix};je suis une matrice _ _= Fx000Foui0cxcoui1

Coefficients de distorsion = ( k 1 k 2 p 1 p 2 k 3 ) Distorsion \ coefficients = (k_1 \ k_2 \ p_1 \ p_2 \ k_3)Coefficients de distorsion _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ =( k1 k2 p1 p2 k3)

référence externe

  • matrice de rotation R ;
  • Matrice de traduction T.

7. Matrice d'homographie

Explication détaillée du principe de l'algorithme d'étalonnage de Zhang Zhengyou

7.1 Présentation

o'-uv est le système de coordonnées des pixels de l'image, o-XYZ est le système de coordonnées mondial. Supposons que les coordonnées d'un point dans l'image sont (u, v) et que la position du point tridimensionnel correspondant est (x, y, z). Alors la relation de conversion entre eux est la suivante : [ u ν 1 ] = s [ fx γ u
0 0 fy ν 0 0 0 1 ] [ r 1 r 2 t ] [ x W y W 1 ] \begin{bmatrix}u\\\nu\\1\end{bmatrix}=s\begin{ bmatrix}f_x&\gamma&u_0 \\0&f_y&\nu_0\\0&0&1\end{bmatrix}\begin{bmatrix}r_1&r_2&t\end{bmatrix}\begin{bmatrix}x_W\\y_W\\1\end{bmatrix} toin1 =s Fx00cFoui0toi0n01 [r1r2t] XWouiW1
Parmi eux, s est le facteur d'échelle, ce qui signifie que les rayons sortant du centre optique de la caméra tomberont sur le même point du plan d'imagerie. u, v représentent les coordonnées dans le système de coordonnées des pixels de l'image, fx, fy, u 0, v 0, γ f_x, f_y, u_0, v_0, \gammaFxfouitoi0v0, γ représente 5 paramètres internes de la caméra, R et t représentent les paramètres externes de la caméra,X w , Y w , Z w X_w, Y_w, Z_wXwOuiwZwReprésente les coordonnées dans le système de coordonnées mondial. Le plan de l'échiquier est situé dans le système de coordonnées mondial Z w = 0 Z_w=0Zw=0 avion.

7.2 La notion d'homographie

La transformation homographique décrit la relation de mappage de position entre l'objet dans le système de coordonnées mondial et le système de coordonnées des pixels de l'image. Cette matrice de transformation est appelée matrice d'homographie. Dans la formule ci-dessus, la matrice d'homographie est définie comme :
H = s [ fx γ u 0 0 fy ν 0 0 0 1 ] [ r 1 r 2 t ] = s M [ r 1 r 2 t ] H=s \begin{bmatrix}f_x&\gamma&u_0\\0&f_y&\nu_0\\0&0&1\end{bmatrix}\begin{bmatrix}r_1&r_2&t\end{bmatrix}=sM\begin{bmatrix}r_1&r_2&t\end{bmatrix}H=s Fx00cFoui0toi0n01 [r1r2t]=M _[r1r2t]
Parmi eux, M est la matrice de référence interne de la caméra :
M = [ fx γ u 0 0 fy ν 0 0 0 1 ] M=\left[\begin{array}{ccc}f_x&\gamma&u_0\\0&f_y&\nu_0\\ 0&0&1\end {tableau}\right]M= Fx00cFoui0toi0n01
La matrice d'homographie contient à la fois les paramètres intrinsèques et extrinsèques de la caméra.

7.3 Applications de l'homographie

7.3.1 Correction d'images

L'utilisation de la matrice d'homographie pour la rectification d'images nécessite au moins quatre points correspondants.
insérer la description de l'image ici

7.3.2 Changement de perspective

La matrice d'homographie peut facilement convertir la vue normale en vue à vol d'oiseau, comme le montre la figure suivante, la gauche est la vue normale et la droite est la vue à vol d'oiseau :
insérer la description de l'image ici

7.3.3 Assemblage d'images

Étant donné que la matrice d'homographie peut effectuer une conversion de perspective, l'épissage d'images peut être réalisé en convertissant des images prises sous différents angles dans la même perspective. Comme le montre la figure ci-dessous, image1 et image2 peuvent être transformées dans le même plan via la matrice d'homographie H.
insérer la description de l'image ici
insérer la description de l'image ici

7.3.4 RA de réalité augmentée

Les marqueurs bidimensionnels plans sont souvent utilisés pour les affichages AR. Sur la base des images de différentes perspectives du marqueur, la position et la posture de l'objet virtuel peuvent être facilement obtenues et réalisées, comme le montre la figure suivante :
insérer la description de l'image ici

7.4 Principe de la matrice d'homographie

Supposons que les coordonnées homogènes des points correspondants dans les deux images soient ( x ′ , y ′ , 1 ) (x^{\prime},y^{\prime},1)( x' ,oui' ,1 ) , la matrice d'homographie H est définie comme :
H = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] H=\left[\begin{array}{ccc}h_{_{ 11}}&h_{_{12}}&h_{_{13}}\\h_{_{21}}&h_{_{22}}&h_{_{23}}\\h_{_{31}}&h_ {_{32}}&h_{_{33}}\end{array}\right]H= h11h21h31h12h22h32h13h23h33
Nom :
[ x ′ ​​y ′ 1 ] ∼ [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] [ xy 1 ] \left[\begin{array}{c}x'\\ y'\\1\end{array}\right]\sim\left[\begin{array}{ccc}h_{11}&h_{12}&h_{13}\\h_{21}&h_{22}&h_{ 23}\\h_{31}&h_{32}&h_{33}\end{array}\right] \begin{bmatrix}x\\y\\1\\\end{bmatrix} X'oui'1 h11h21h31h12h22h32h13h23h33 Xoui1
Après développement matriciel, il y a 3 équations, et la troisième équation est introduite dans les deux premières équations pour obtenir :
x ′ = h 11 x + h 12 y + h 13 h 31 x + h 32 y + h 33 x'=\ frac{h_{11}x+h_{12}y+h_{13}}{h_{31}x+h_{32}y+h_{33}}X'=h31X+h32oui+h33h11X+h12oui+h13

y ′ = h 21 x + h 22 y + h 23 h 31 x + h 32 y + h 33 y'=\frac{h_{21}x+h_{22}y+h_{23}}{h_{31 }x+h_{32}y+h_{33}}oui'=h31X+h32oui+h33h21X+h22oui+h23

Autrement dit, une paire de points correspond à deux équations.

Ajoutez des contraintes à H pour que le module de la matrice H devienne 1, c'est-à-dire ∣ ∣ H ∣ ∣ = 1 ||{H}||=1∣∣ H ∣∣=1,如下:
x ′ = h 11 x + h 12 y + h 13 h 31 x + h 32 y + h 33 ( 1 ) x'=\frac{h_{11}x+h_{12}y+h_{ 13}}{h_{31}x+h_{32}y+h_{33}} \quad (1)X'=h31X+h32oui+h33h11X+h12oui+h13( 1 )

y ′ = h 21 x + h 22 y + h 23 h 31 x + h 32 y + h 33 ( 2 ) y'=\frac{h_{21}x+h_{22}y+h_{23}}{ h_{31}x+h_{32}y+h_{33}} \quad (2)oui'=h31X+h32oui+h33h21X+h22oui+h23( 2 )

h 11 2 + h 12 2 + h 13 2 + h 21 2 + h 22 2 + h 23 2 + h 31 2 + h 32 2 + h 33 2 = 1 h_{11}^2+h_{12}^2 +h_{13}^2+h_{21}^2+h_{22}^2+h_{23}^2+h_{31}^2+h_{32}^2+h_{33}^2= 1h112+h122+h132+h212+h222+h232+h312+h322+h332=1

Multipliez la formule ci-dessus (1) et (2) par le dénominateur pour développer :
( h 31 x + h 32 y + h 33 ) x ′ = h 11 x + h 12 y + h 13 \left(h_{31}x +h_{32}y+h_{33}\right)x^{\prime}=h_{11}x+h_{12}y+h_{13}( h31X+h32oui+h33)X'=h11X+h12oui+h13

( h 31 x + h 32 y + h 33 ) y ′ = h 21 x + h 22 y + h 23 \left(h_{31}x+h_{32}y+h_{33}\right)y^{ \prime}=h_{21}x+h_{22}y+h_{23}( h31X+h32oui+h33)oui'=h21X+h22oui+h23

Après avoir terminé, nous obtenons :
h 11 x + h 12 y + h 13 − h 31 xx ′ − h 32 yx ′ − h 33 x ′ = 0 h_{11}x+h_{12}y+h_{13}- h_{ 31}xx^{\prime}-h_{32}yx^{\prime}-h_{33}x^{\prime}=0h11X+h12oui+h13h31xx _'h32oui x'h33X'=0

h 21 x + h 22 y + h 23 − h 31 xy ′ − h 32 yy ′ − h 33 y ′ = 0 h_{21}x+h_{22}y+h_{23}-h_{31}xy' -h_{32}yy'-h_{33}y'=0h21X+h22oui+h23h31xy _'h32ouais _'h33oui'=0

Supposons que nous obtenions les N paires de points correspondantes (paires de correspondance de points caractéristiques) dans les deux images, nous pouvons obtenir les équations linéaires suivantes :
insérer la description de l'image ici

Le graphique est :
2 N x 9 9 x 1 2 N x 1 A h = 0 \begin{array}{cccc}\mathbf{2Nx9}&\mathbf{9x1}&&\mathbf{2Nx1}\\\mathbf{A }&\mathbf{h}&=&\mathbf{0}\end{array}2Nx9Un9x1h=2Nx10
Dans des scénarios d'application réels, les paires de points calculées contiendront du bruit. Par exemple, la position d'un point s'écarte de quelques pixels, et même les paires de points caractéristiques peuvent ne pas correspondre. Si seulement quatre paires de points sont utilisées pour calculer la matrice d'homographie, une erreur importante se produira. Par conséquent, afin de rendre le calcul plus précis, plus de 4 paires de points sont généralement utilisées pour calculer la matrice d'homographie. De plus, les équations linéaires mentionnées ci-dessus adoptent une méthode de solution linéaire directe, qui est généralement difficile à obtenir la solution optimale. Par conséquent, dans l'utilisation réelle, d'autres méthodes d'optimisation sont généralement utilisées, telles que la décomposition en valeurs singulières, Levenberg-Marquarat (LM) algorithme, etc. pour la solution.

7.5 Processus de calcul de la matrice d'homographie

La matrice d'homographie H est calculée à partir du diagramme de calibrage de l'échiquier imprimé et des photos prises. Le processus général est le suivant :

  1. Imprimez un dessin de calibrage en damier et collez-le sur la surface de l'objet plat ;

  2. Prendre une série de photos en damier dans différentes directions peut être réalisé en déplaçant l'appareil photo ou en déplaçant l'image d'étalonnage ;

  3. Pour chaque photo d'échiquier prise, les points d'angle de tous les échiquiers de l'image sont détectés.

  4. Étant donné que les coordonnées mondiales de tous les points d'angle dans le dessin d'étalonnage de l'échiquier sont connues, les coordonnées des pixels de l'image correspondant à ces points d'angle sont également connues. S'il y a N>=4 paires de points correspondants, la matrice d'homographie H peut être obtenue selon des méthodes d'optimisation telles que LM. Plus il y a de paires de points correspondants, plus le résultat du calcul est robuste. Le calcul de la matrice d'homographie n'a généralement pas besoin d'être implémenté en écrivant une fonction. Il existe des fonctions prêtes à l'emploi dans OpenCV qui peuvent être appelées. La fonction C++ correspondante est :

    Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )
    

    Du point de vue fonctionnel, tant que la paire de points correspondants est saisie et que la méthode de calcul spécifique est spécifiée, la matrice d'homographie peut être obtenue.

3. Méthode d'étalonnage de la caméra de Zhang Zhengyou

1. Introduction

Le Dr Zhang Zhengyou a publié un article intitulé « Étalonnage flexible de la caméra en regardant un plan depuis des orientations inconnues » lors de la conférence internationale ICCV en 1999, proposant une méthode pratique d'étalonnage de la caméra à l'aide d'un damier plan. Cette méthode se situe entre la méthode d'étalonnage photographique et la méthode d'auto-étalonnage. Elle surmonte non seulement les défauts des objets d'étalonnage tridimensionnels de haute précision requis par la méthode d'étalonnage photographique, mais résout également le problème de la faible robustesse de l'auto-étalonnage. méthode d'étalonnage. Le processus de calibrage ne nécessite qu'un damier imprimé et plusieurs séries d'images prises dans différentes directions. N'importe qui peut créer lui-même le motif de calibrage. Il est non seulement pratique, flexible et pratique, mais présente également une haute précision et une bonne robustesse. Par conséquent, il a été rapidement largement adopté dans le monde entier, favorisant grandement le processus de vision par ordinateur 3D du laboratoire au monde réel.

La méthode d'étalonnage de Zhang Zhengyou utilise une plaque d'étalonnage composée de carrés bidimensionnels pour l'étalonnage, collecte des images de la plaque d'étalonnage dans différentes poses, extrait les coordonnées en pixels des points d'angle dans les images, calcule les valeurs initiales de l'interne et de l'externe. paramètres de la caméra à travers la matrice d'homographie et utilise les moindres carrés non linéaires. Le coefficient de distorsion est estimé de manière multiplicative, et enfin la méthode d'estimation du maximum de vraisemblance est utilisée pour optimiser les paramètres. Cette méthode est simple à utiliser, a une haute précision et peut répondre à la plupart des occasions.

2. Introduction à Zhang Zhengyou

Le Dr Zhang Zhengyou est un expert de renommée mondiale en vision par ordinateur et en technologie multimédia, ACM Fellow, IEEE Fellow. Il est actuellement chercheur principal au sein du Visual Computing Group de Microsoft Research. Il a apporté des contributions majeures dans les domaines de la vision stéréoscopique, de la reconstruction 3D, de l'analyse de mouvement, de l'enregistrement d'images, de l'étalonnage de caméras, etc.

3. Tableau d'étalonnage en damier

3.1 Introduction au tableau d'étalonnage en damier

Le tableau d'étalonnage en damier est un tableau d'étalonnage composé d'intervalles carrés noir et blanc, utilisé comme objet d'étalonnage pour l'étalonnage de la caméra (objets mappés du monde réel aux images numériques). La raison pour laquelle un échiquier est utilisé comme objet d'étalonnage est que, comparé aux objets tridimensionnels complexes, un motif d'échiquier plat est plus facile à traiter. Dans le même temps, les objets bidimensionnels manquent de certaines informations par rapport aux objets tridimensionnels. Les images sont capturées en changeant plusieurs fois l'orientation de l'échiquier pour obtenir des informations de coordonnées plus riches. Comme le montre la figure ci-dessous, il s'agit d'une image de la même plaque d'étalonnage en damier prise par la caméra dans différentes directions.
insérer la description de l'image ici

3.2 Obtenir le tableau de calibrage en damier

calib.io

3.2.1 Plaque d'étalonnage de la grille

Télécharger : Plaque d’étalonnage de grille

Taille de la plaque d'étalonnage : w=9, h=6.
insérer la description de l'image ici

3.2.2 Plaque d'étalonnage circulaire

Télécharger : Plaque d'étalonnage circulaire

La taille de la plaque d'étalonnage : w=11, h=4.
insérer la description de l'image ici

La taille de la plaque d'étalonnage : w=17, h=6.
insérer la description de l'image ici

3.2.3 Plaque d'étalonnage ChAruco

  • Planche ChAruco 7X5 ;
  • taille du carré : 30 mm ;
  • taille du marqueur : 15 mm ;
  • aruco dict : DICT_5X5_100 ;
  • largeur de page : 210 mm, hauteur de page : 297 mm。
    insérer la description de l'image ici

3.2.4 Générer un tableau d'étalonnage en damier

Créer un modèle d'étalonnage

Utilisez Python pour générer une plaque d'étalonnage personnalisée et téléchargez le fichier de script Python : gen_pattern.py

3.3 Coins

Le point d'angle est le point d'intersection du damier noir et blanc, comme le montre la figure ci-dessous, le cercle magenta du milieu est un point d'angle.
insérer la description de l'image ici

Comme le montre la figure ci-dessous, il y a 8 points d'angle dans la direction X et 3 points d'angle dans la direction Y.
insérer la description de l'image ici

3.4 Points d'angle intérieurs

Le point d'angle fait référence à la partie fixe du carré où le noir et le blanc sont connectés ; le point d'angle interne est le point d'angle interne qui n'entre pas en contact avec le bord de la plaque d'étalonnage.

patternSize :(w,h), le nombre de coins intérieurs dans chaque ligne et colonne de l'échiquier. w=le nombre de blocs noirs et blancs dans une rangée de l'échiquier -1, h=le nombre de blocs noirs et blancs dans une colonne de l'échiquier -1, par exemple : un échiquier 9x4, alors (w,h)= (8,3)

3.5 Système de coordonnées de la plaque d'étalonnage en damier

Le système de coordonnées du tableau d'étalonnage en damier adopte le mode d'étalonnage plan par défaut, c'est-à-dire que l'axe Z est zéro.

Définir le tableau d'étalonnage en damier à situer dans le système de coordonnées mondial Z w = 0 Z_w=0Zw=Sur le plan 0 , l'origine du système de coordonnées mondiales est située à un coin fixe de la plaque d'étalonnage en damier, comme le point jaune sur l'image ci-dessous. L'origine du système de coordonnées des pixels de l'image est située dans le coin supérieur gauche de l'image.
insérer la description de l'image ici

Lors de l'écriture des coordonnées, assurez-vous que l'axe Z est 0 et écrivez d'abord dans l'ordre de changement X, puis de changement Y, de petit à grand. Si la taille de la grille du tableau d'étalonnage de l'échiquier est de 5 cm, les coordonnées dans le système de coordonnées mondial peuvent être écrites comme suit : (0,0,0), (5,0,0), (10,0,0)... (0,5,0), (5,5,0), (10,5,0),…

4. Processus de calcul de la méthode d'étalonnage de Zhang Zhengyou

À l'aide d'un tableau d'étalonnage en damier pour l'étalonnage, vous devez trouver les coins intérieurs du damier. Selon les coordonnées des coins intérieurs du damier dans le système de coordonnées des pixels de l'image et les coordonnées de chaque point dans le système de coordonnées mondial, prenez plusieurs photos. positions du damier et de plusieurs points.Résolvez les paramètres internes et externes de la caméra.

En utilisant OpenCV pour effectuer la méthode d'étalonnage de Zhang Zhengyou, le processus de calcul est le suivant :

  1. Préparez des images d'étalonnage, théoriquement au moins 4 images, généralement environ 20 images collectées sous plusieurs angles ;
  2. Extrayez les points d'angle de la plaque d'étalonnage et calculez les coordonnées des points d'angle sur la plaque d'étalonnage. Généralement, la plaque d'étalonnage est considérée comme le plan XY et Z est 0 ;
  3. L'étalonnage de la caméra, les paramètres internes et externes et les paramètres de distorsion sont calculés via la méthode d'étalonnage de Zhang Zhengyou ;
  4. Les résultats d'étalonnage sont évalués, généralement par erreur de reprojection ;
  5. Vérifiez l'effet de l'étalonnage et utilisez les résultats de l'étalonnage pour corriger le diagramme en damier.

5. Fonctions principales

cornerSubPix()

Apprentissage feature2D dans OpenCV - détection de coin sous-pixel (cornerSubPix)

Détection de coin de sous-pixel OpenCV3 : cornerSubPix()

Fonction : Détection des points d'angle au niveau des sous-pixels, position précise du point d'angle interne jusqu'à une précision au niveau des sous-pixels.

void cornerSubPix(InputArray image, 
                  InputOutputArray corners, 
                  Size winSize, 
                  Size zeroZone, 
                  TermCriteria criteria);

Explication des paramètres

  • imageIndique l'entrée de l'image originale de la carte d'étalonnage de l'échiquier (matrice d'image), qui est le paramètre d'entrée. La matrice d'image doit être une image en niveaux de gris de 8 bits ou une image couleur. Avant que l'image ne soit transmise à la fonction, elle subit généralement des opérations de traitement et de filtrage en niveaux de gris ;

  • cornersReprésente les coordonnées du point du coin intérieur, qui est à la fois un paramètre d’entrée et un paramètre de sortie. Utilisez findChessboardCorners()les coins intérieurs de sortie comme coins d'entrée de la fonction et affichez les coins après la détection des coins intérieurs au niveau des sous-pixels ;

  • winSizeReprésente la moitié de la longueur du côté de la fenêtre de recherche. Par exemple, si winSize= Size(5, 5), alors la taille d'un( 5*2+1 )*( 5*2+1 )=11*Une fenêtre de recherche de 11 sera utilisée ;

  • zeroZoneReprésente la moitié de la longueur de la région morte au milieu de la zone de recherche, parfois utilisée pour éviter la singularité de la matrice d'autocorrélation. Si la valeur est définie sur (-1,-1), cela signifie qu'une telle zone n'existe pas ;

  • criteriaIndique la condition de fin du processus itératif de précision au niveau des sous-pixels des points d’angle. Les valeurs possibles sont :

    • cv::TermCriteria::MAX_ITERIndique qu'il s'arrêtera lorsque le nombre d'itérations atteindra le nombre maximum ;
    • cv::TermCriteria::EPSIndique que l'itération s'arrête lorsque le changement de position du point de coin a atteint la valeur minimale.

    Les deux sont cv::TermCriteria()spécifiés à l’aide de constructeurs et peuvent être combinés.

    //指定亚像素计算迭代条件
    cv::TermCriteria criteria = cv::TermCriteria(
        cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,  // 终止条件
        40,  // 最大次数
        0.01); // 最小值
    

findChessboardCorners()

Explication détaillée de la détection des coins findChessboardCorners()

Fonction : Détection de coin, obtenez la position des points de coin dans le tableau d'étalonnage en damier .

Valeur de retour : tous les points d'angle sont détectés et disposés dans un certain ordre, et un nombre différent de zéro est renvoyé, sinon 0 est renvoyé.

// 函数原型
findChessboardCorners(InputArray image,
                      Size patternSize,
                      OutputArray corners,
                      int flags);

Explication des paramètres

  • imageIndique l'entrée de l'image originale de la carte d'étalonnage de l'échiquier (matrice d'image), qui est le paramètre d'entrée. La matrice d'image doit être une image en niveaux de gris de 8 bits ou une image couleur. Avant que l'image ne soit transmise à la fonction, elle subit généralement des opérations de traitement et de filtrage en niveaux de gris ;

  • patternSizeLa taille représentant le point du coin intérieur est un paramètre d'entrée.

    Type de données : Size patternSize(w,h), w et h représentent respectivement le nombre d'angles intérieurs dans chaque ligne et colonne de l'échiquier.

    w = le nombre total de blocs noirs et blancs dans une rangée du tableau d'étalonnage en damier-1, h = le nombre total de blocs noir et blanc dans une colonne du tableau d'étalonnage en damier-1

    Par exemple : tableau d'étalonnage en damier 10x6, puis (w,h)=(9,5).

    Remarque : Déterminez la direction de la plaque d'étalonnage en fonction de la taille du point du coin intérieur. Plus précisément, si w et h sont différents, cette fonction peut identifier la direction de la plaque d'étalonnage ; si w et h sont identiques, la position de départ du point d'angle dessiné par cette fonction changera à chaque fois, ce qui n'est pas propice à l'étalonnage. .

  • cornersTableau de sortie représentant les points de coin intérieurs détectés, paramètres de sortie.

    Type de données : vector<vector<point2f>>.

  • flagsLe drapeau est un paramètre d'entrée avec une valeur par défaut.

    • CV_CALIB_CB_ADAPTIVE_THRESH: Le mode par défaut de la fonction utilise la méthode du seuil adaptatif pour binariser l'image au lieu d'utiliser un seuil fixe ;
    • CV_CALIB_CB_NORMALIZE_IMAGE: Avant d'utiliser la méthode du seuil fixe ou du seuil adaptatif pour binariser l'image, appelez la fonction EqualizeHist() pour normaliser l'image et utilisez l'histogramme pour égaliser l'image ;
    • CV_CALIB_CB_FILTER_QUADS: Une fois la binarisation terminée, la fonction commence à localiser le quadrilatère dans l'image (il ne faut pas l'appeler ici un carré car il y a une distorsion). Utilisez des critères supplémentaires (tels que la surface du contour, le périmètre, la forme carrée) pour filtrer les faux quadrilatères extraits lors de l'étape de récupération du contour, rendant ainsi la détection des coins plus précise et rigoureuse ;
    • CALIB_CB_FAST_CHECK: Option de détection rapide, un mécanisme d'inspection rapide sur l'image pour retrouver les coins de la planche. Pour les situations où la détection des points d'angle est très susceptible d'échouer, cet indicateur peut améliorer l'efficacité de la fonction.

    Avis: Les bits de drapeau peuvent être utilisés en combinaison. CALIB_CB_FAST_CHECKGénéralement utilisé pour une détection rapide, il est très probable que la détection échoue, notamment lorsque la lumière sur la carte est inégale. Dans l’ensemble, CV_CALIB_CB_ADAPTIVE_THRESHc’est le moyen le plus probable de détecter les damiers. Il est recommandé d'utiliser la combinaison CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_NORMALIZE_IMAGESi les points d'angle ne peuvent pas être détectés dans la méthode par défaut ou cette méthode de combinaison, vous devez essentiellement réacquérir l'image.

La fonction de cette fonction est de déterminer si l'image contient un damier complet. Si elle peut être complètement détectée, enregistrez la séquence de position des coins (de gauche à droite, de haut en bas) et renvoyez un nombre non nul, sinon renvoyez 0 . Les exigences en matière de paramètres ici patternSizesont très strictes. La fonction doit détecter la même taille avant de renvoyer une valeur non 0, sinon elle renvoie 0.

Les coordonnées des points de coin détectés par cette fonction sont inexactes. Pour obtenir les coordonnées précises des points de coin, vous pouvez utiliser cornerSubPix()la fonction pour extraire les sous-pixels des points de coin. Pour les méthodes d'utilisation, veuillez vous référer au blog : Corner Point Utilisation des fonctions de détection et d'optimisation

drawChessboardCorners()

Fonction : dessinez les points d'angle détectés dans l'image originale.

calibrateCamera()

calibrateCamera de l'utilisation de la fonction OpenCV

Fonction : calibrage de la caméra.

double calibrateCamera(InputArrayOfArrays objectPoints, 
                       InputArrayOfArrays imagePoints,
                       Size imageSize, 
                       InputOutputArray cameraMatrix, 
                       InputOutputArray distCoeffs, 
                       OutputArrayOfArrays rvecs, 
                       OutputArrayOfArrays tvecs, 
                       int flags=0);

Explication des paramètres

  • objectPointsReprésente des points dans le système de coordonnées mondial, c'est-à-dire des points 3D.

    Le type de données est : std::vector<std::vector<cv::Point3f>> objectPoints, le premier vecteur de couche représente chaque perspective (chaque image) et le deuxième vecteur de couche représente chaque point.

  • imagePoints Représente les points dans son système de coordonnées de pixels d'image correspondant, c'est-à-dire des points 2D. Cette valeur peut findChessboardCorners()être obtenue à partir de l'image à l'aide de la fonction.

    Le type de données est : std::vector<std::vector<cv::Point2f>> imagePoints, le premier vecteur de calque représente chaque perspective et le deuxième vecteur de calque représente chaque point de coin intérieur.

  • imageSizeReprésente la taille de l'image, nécessaire pour calculer les paramètres internes et la matrice de distorsion de la caméra ;

  • cameraMatrixReprésente la matrice des paramètres intrinsèques de la caméra, la taille de la matrice est de 3x3. Cette matrice est le résultat de la sortie d'étalonnage de la caméra.

    Le type de données est :cv::Mat cameraMatrix ;

  • distCoeffsReprésente la matrice de distorsion, la taille spécifique dépend des paramètres flags. Cette matrice est le résultat de la sortie d'étalonnage de la caméra.

    Type de données :cv::Mat distCoeffs ;

  • rvecsreprésente le vecteur rotation. Chacun vector<Point3f>obtiendra un rvecs, chaque vec est 3x1, qui peut être Rodrigues()converti en une matrice de rotation 3x3 à l'aide de la fonction.

    Type de données :vector<cv::Mat> rvecs ;

  • tvecsReprésente le vecteur de traduction, comme rvecs, chaque vec est 3x1.

    Type de données :vector<cv::Mat> tvecs ;

    Les paramètres rvecs et tvecs sont des paramètres extrinsèques de la caméra. Pour chaque vue, son système de coordonnées mondial peut être converti en système de coordonnées de caméra.

  • flagsIndique les paramètres utilisés lors de l'étalonnage, notamment la décision d'utiliser ou non la valeur initiale, le nombre de paramètres de la matrice de distorsion, etc. Il y a les paramètres suivants :

    • CV_CALIB_USE_INTRINSIC_GUESS: Lors de l'utilisation de ce paramètre, il doit y avoir des valeurs estimées de fx, fy, cx, cy dans la matrice cameraMatrix. Sinon, le point central de l'image (cx, cy) sera initialisé, et fx, fy seront estimés par les moindres carrés ;
    • CV_CALIB_FIX_PRINCIPAL_POINT: Le point de l'axe optique sera fixé lors de l'optimisation. Lorsque le paramètre CV_CALIB_USE_INTRINSIC_GUESS est défini, le point de l'axe optique restera au centre ou à une valeur d'entrée ;
    • CV_CALIB_FIX_ASPECT_RATIO: Corrigez le rapport fx/fy et utilisez uniquement fy comme variable variable pour le calcul d'optimisation. Lorsque CV_CALIB_USE_INTRINSIC_GUESS n'est pas défini, fx et fy seront ignorés. Seul le ratio fx/fy sera utilisé dans le calcul ;
    • CV_CALIB_ZERO_TANGENT_DIST: Mettre les paramètres de distorsion tangentielle (p1, p2) à zéro ;
    • CV_CALIB_FIX_K1,…,CV_CALIB_FIX_K6 : La distorsion radiale correspondante reste inchangée lors de l'optimisation ;
    • CV_CALIB_RATIONAL_MODEL: Calculez les trois paramètres de distorsion de k4, k5 et k6. S’ils ne sont pas définis, seuls les 5 autres paramètres de distorsion sont calculés.

6. Exemple de code

Utilisez OpenCV pour implémenter le processus d'étalonnage de Zhang Zhengyou.

6.1 Implémentation C++

Notes d'étude de l'algorithme d'étalonnage visuel de Zhang Zhengyou

Exemple 1

Calibrez plusieurs vues.

#include <iostream>
#include <opencv2/opencv.hpp>
#include  <boost/filesystem.hpp>

std::vector<std::string> get_all_image_file(std::string image_folder_path){
    boost::filesystem::path dirpath = image_folder_path;
    boost::filesystem::directory_iterator end;
    std::vector<std::string> files;
    for (boost::filesystem::directory_iterator iter(dirpath); iter != end; iter++)
    {
        boost::filesystem::path p = *iter;
        files.push_back(dirpath.string()+ "/"+ p.leaf().string());
    }
     std::sort(files.begin(),files.end());
    return files;
}

std::vector<cv::Mat> get_all_iamge(std::string image_folder_path)
{
    std::vector<cv::Mat> images;
    std::vector<std::string> image_files_path = get_all_image_file(image_folder_path);
    for(int i=0; i<  image_files_path.size() ;i++){
        cv::Mat image;
        image = cv::imread(image_files_path[i]);
        images.push_back(image);
    }
    return images;
}

int find_chessboard(cv::Mat image, std::vector<cv::Point2f> &image_points, cv::Size board_size)
{
    if (0 == findChessboardCorners(image, board_size, image_points))
    {
        std::cout<<"can not find chessboard corners!\n";
        return 0;
    }
    else
    {
        cv::Mat view_gray;
        cv::cvtColor(image,view_gray,cv::COLOR_RGB2GRAY);
        //对粗提取的角点进行亚像素精确化
        cv::find4QuadCornerSubpix(view_gray,image_points,cv::Size(11,11)); 
        //int nChessBoardFlags = cv::CALIB_CB_EXHAUSTIVE | cv::CALIB_CB_ACCURACY;
        //bool bFindResult = findChessboardCornersSB(view_gray,board_size,image_points,nChessBoardFlags );   
        //Opencv4 识别棋盘格方法,比opencv3有较大提升
    }
    return 1;
}

int init_chessboard_3dpoints(cv::Size board_size, std::vector<cv::Point3f> &points, float point_size)
{
    cv::Size2f square_size = cv::Size2f(point_size,point_size);
    for (int i=0;i<board_size.height;i++){
        for (int j=0;j<board_size.width;j++){
            cv::Point3f realPoint;
            realPoint.x = j*square_size.width;
            realPoint.y = i*square_size.height;
            realPoint.z = 0;
            points.push_back(realPoint);
        }
    }
    return 0;
}


void calib_monocular(std::vector<cv::Mat> images){
    cv::Size image_size;
    cv::Size board_size(11,4);
    std::vector<cv::Mat> images_tvecs_mat;
    std::vector<cv::Mat> images_rvecs_mat;
    image_size.width = images[0].cols;
    image_size.height = images[0].rows;
    std::vector<std::vector<cv::Point2f> > images_points;
  	// 识别所有图片的棋盘格
    for(int i=0;i<images.size();i++){
        std::vector<cv::Point2f> image_points;
        if(find_chessboard(images[i],image_points,board_size)>0){
             images_points.push_back(image_points);
        }
    }

    std::vector<cv::Point3f> image_points_in3d;
	// 计算棋盘格角点在棋盘格坐标系中的位置
    init_chessboard_3dpoints(board_size,image_points_in3d,0.045);  // 0.045为棋盘格一个格子的大小
    std::vector<std::vector<cv::Point3f> > images_points_in3d;
	// 生成所有识别出的标定板对应在各自棋盘格坐标系中的位置
    for(int i=0;i<images_points.size();i++){
        images_points_in3d.push_back(image_points_in3d);
    }
    cv::Mat intrinsic,distortion;
	// 使用张正友标定法计算内参畸变以及外参
    cv::calibrateCamera(images_points_in3d,
                        images_points,
                        image_size,
                        intrinsic,
                        distortion,
                        images_rvecs_mat,
                        images_tvecs_mat);
}

int main(int argc, char *argv[])
{
    std::string image_file_path = argv[1];
    std::vector<cv::Mat> images = get_all_iamge(image_file_path);
    calib_monocular(images);
    return 0;
}

insérer la description de l'image ici

Exemple deux

Calibrez une seule vue.

int cols = 10;
int rows = 7;
float distance = 30;    //间距30mm

cv::Size patternSize(cols,rows);
std::vector<cv::Point2f> corners;
std::vector<std::vector<cv::Point2f>> cornersVect;
std::vector<cv::Point3f> worldPoints;
std::vector<std::vector<cv::Point3f>> worldPointsVect;

for (int i=0;i<cols;i++)
{
    for (int j=0;j<rows;j++)
    {
        worldPoints.push_back(cv::Point3f(i*distance,j*distance,0));
    }
}

bool find=cv::findChessboardCorners(image,patternSize,corners);
cv::drawChessboardCorners(image,patternSize,corners,find);
cv::Mat cameraMatirx,distCoeffs;
std::vector<cv::Mat> rvecs,tvecs,rvecs2,tvecs2;
if (find)
{    
    cornersVect.push_back(corners);
    worldPointsVect.push_back(worldPoints);
    cv::calibrateCamera(worldPointsVect,
                        cornersVect,image.size(),
                        cameraMatirx,
                        distCoeffs,
                        rvecs,tvecs);
}

6.2 Implémentation de Python

[Notes d'étude] Utilisation de base de python-Opencv cv2.findChessboardCorners()

Exemple 1

Calibrez une seule vue.

import numpy as np
import cv2
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

fname='calibration_test.png'

image=cv2.imread(fname)
# plt.imshow(image)
# plt.show()

gray=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
plt.imshow(gray,cmap='gray')
plt.show()

# Find the chessboard corners
nx=8
ny=6
ret, corners = cv2.findChessboardCorners(gray, (nx, ny), None)

print('ret:',ret)
# print(len(corners))

# If found, draw corners
if ret == True:
    # Draw and display the corners
    cv2.drawChessboardCorners(image, (nx, ny), corners, ret)
    plt.imshow(image)

Comme le montre la figure ci-dessous, pour un tableau d'étalonnage en damier 9x7, une rangée de damiers vaut 9 et une colonne de damiers vaut 7, donc patternSize(w,h)w=8 et h=6 dans les points des coins intérieurs.
insérer la description de l'image ici
insérer la description de l'image ici
insérer la description de l'image ici

Exemple deux

Calibrez une seule vue.

import numpy as np
import cv2 as cv
import glob


# termination criteria
# 
criteria = (cv.TERM_CRITERIA_MAX_ITER + cv.TERM_CRITERIA_EPS, 30, 0.001)

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
"""
objp = 
[[0 0 0], 
[0 0 0],
...,
[0 0 0]], (42, 3)
"""
objp = np.zeros((6*7,3), np.float32)

"""
np.mgrid[0:7,0:6] = array([
[[0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2],
[3, 3, 3, 3, 3, 3],
[4, 4, 4, 4, 4, 4],
[5, 5, 5, 5, 5, 5],
[6, 6, 6, 6, 6, 6]],

[[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]]]), (2, 7, 6)

objp = array([
[0 0 0], 
[1 0 0], 
[2 0 0],
...,
[6 5 0]], (42, 3)
"""
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

# Arrays to store object points and image points from all the images.
objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.

images = glob.glob('*.jpg')
for fname in images:
	img = cv.imread(fname)
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    
    # Find the chess board corners
    ret, corners = cv.findChessboardCorners(gray, (7,6), None)
    
    # If found, add object points, image points (after refining them)
    if ret == True:
        objpoints.append(objp)
        corners2 = cv.cornerSubPix(gray,corners, (11,11), (-1,-1), criteria)
        imgpoints.append(corners2)
        
        # Draw and display the corners
        cv.drawChessboardCorners(img, (7,6), corners2, ret)

        cv.imshow('img', img)
        cv.waitKey(500)
cv.destroyAllWindows()

# Calibration
"""
camera matrix: mtx
distortion coefficients: dist
rotation vectors: rvecs
translation vectors: tvecs
"""
ret, mtx, dist, rvecs, tvecs = cv.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

if ret == True:
    # Re-projection Error
    mean_error = 0
    for i in range(len(objpoints)):
         imgpoints2, _ = cv.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
         error = cv.norm(imgpoints[i], imgpoints2, cv.NORM_L2)/len(imgpoints2)
         mean_error += error
    print( "total error: {}".format(mean_error/len(objpoints)) )

patternSize(w,h)Comme le montre la figure ci-dessous, pour un tableau d'étalonnage en damier 8x7, une rangée de damiers vaut 9 et une colonne de damiers vaut 7, donc w=7 et h=6 dans les points des coins intérieurs .
insérer la description de l'image ici
insérer la description de l'image ici

4. Expérience connexe

Résumé de l'implémentation du calibrage opencv (points, damiers et points asymétriques)

Je suppose que tu aimes

Origine blog.csdn.net/m0_37605642/article/details/132484138
conseillé
Classement