Le supplément aux Tutoriels OpenCV-Python "Calibration de la caméra" a été réécrit en un article séparé.
[fx, 0, cx; 0, fy, cy; 0, 0, 1] Il est facile d'oublier que l'unité des distances focales fx et fy est le pixel. Le [pixel] centré sur la caméra (cx, cy) ne correspond pas toujours à la moitié de la taille de l'image. Il ne correspondra que si la caméra est correctement tournée vers l'avant. L'axe devant la caméra n'est pas toujours orthogonal à l'axe reliant les deux caméras de la caméra stéréo. Par conséquent, la position du point de fuite lorsque le sujet s'éloigne de l'appareil photo est différente du centre de l'image. (Cx, cy) au centre de la caméra est la coordonnée du point de fuite.
Lorsque calibré avec une caméra stéréo La différence de position du centre de la caméra de la caméra gauche et de la caméra droite indique que les orientations des deux caméras ne sont pas légèrement parallèles.
(cx-la moitié de la largeur de l'image) / fx Il semble qu'il soit tan (θx) de l'angle de déviation θx de la direction de la caméra.
(Je ne suis pas un expert, donc je suis désolé si je fais une erreur.)
Lors de la correspondance stéréo, après avoir créé un module de caméra stéréo Il s'agit de confirmer en effectuant un étalonnage + correction de distorsion pour la paire stéréo. Ce faisant, vous pouvez vérifier visuellement dans quelle mesure la correction de distorsion est réussie. Dans les zones où la correction de la distorsion échoue, les valeurs de parallaxe se décaleront systématiquement et ne renverront pas les valeurs correctes.
calibrate.py C'est un script d'étalonnage + correction de distorsion. cv2.calibrateCamera() cv2.getOptimalNewCameraMatrix() cv2.undistort()
Situé dans (répertoire opencv_2) \ sources \ samples \ python2 calibrate.py C'est un script qui calibre uniquement et ne corrige pas la distorsion.
cv2.calibrateCamera()
Exemple de rectification stéréo tom5760/stereo_vision
stereo_match.py Calcule la correspondance stéréo à partir de l'image après la parallélisation stéréo, Il produit une différence de distance et convertit la distance. Dans celui-ci, la parallaxe est convertie en coordonnées 3D comme suit.
python
Q = np.float32([[1, 0, 0, -0.5*w],
[0,-1, 0, 0.5*h], # turn points 180 deg around x-axis,
[0, 0, 0, -f], # so that y-axis looks up
[0, 0, 1, 0]])
points = cv2.reprojectImageTo3D(disp, Q)
Ses coordonnées spatiales sont facilement converties en fichiers avec une extension .ply, Resulting .ply file cam be easily viewed using MeshLab ( http://meshlab.sourceforge.net/ ) Comme il est écrit, il peut être affiché en 3D avec MeshLab comme suit.
La figure montre les coordonnées 3D générées dans stereo_match.py affichées dans MeshLab.
Il était difficile de remarquer que le tissu derrière le avait un changement de profondeur comme cet écran 3D.
Il y a une découverte que l'affichage 3D est fait avec MeshLab etc. comme ça.
La conversion au format de fichier ply pour cela est incluse dans le script python ci-dessus. Le code suivant est le code de la pièce qui génère les données 3D (à la fois les coordonnées 3D de chaque point et la couleur) à cet effet. C'est très facile à écrire car il utilise la fonction savetxt () de numpy.
python
import numpy as np
import cv2
ply_header = '''ply
format ascii 1.0
element vertex %(vert_num)d
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
'''
def write_ply(fn, verts, colors):
verts = verts.reshape(-1, 3)
colors = colors.reshape(-1, 3)
verts = np.hstack([verts, colors])
with open(fn, 'w') as f:
f.write(ply_header % dict(vert_num=len(verts)))
np.savetxt(f, verts, '%f %f %f %d %d %d')
Lors du calcul de la disparité, spécifiez la valeur de disparité minimale et le nombre de recherches afin que la disparité ne soit recherchée que dans une certaine plage de l'agencement et de l'objet. Avec ça ・ Il est moins susceptible de donner une mauvaise parallaxe. ・ Le temps de calcul est réduit. Cela mène à.
Liste des exemples de sources pour OpenCV 2.4.0 (samples / cpp) https://github.com/YusukeSuzuki/opencv_sample_list_jp/blob/master/samples_cpp.rst Il est également utile de lire des exemples de programmes liés à la stéréo en C ++ à partir de. 3calibration.cpp calibration.cpp calibration_artificial.cpp stereo_calib.cpp stereo_match.cpp
La valeur de disparité ainsi détectée a tendance à être affectée par le bruit. Dans OpenCV3.1, l'influence du bruit peut être réduite en utilisant la fonction suivante. cv::ximgproc::DisparityWLSFilter Class Reference Il convient de noter qu'OpenCV3.1 a une interface de fonction différente du système OpenCV2.4, mais cela vaut la peine d'essayer.
Calibrage de la caméra fisheye avec OpenCV
Utilisez la fonction d'étalonnage cv :: fisheye :: calibrate () pour les caméras fisheye pour obtenir les paramètres de la caméra. La description de la fonction se trouve sur la page suivante. http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#fisheye-calibrate
J'ai trouvé dans le [serveur de documentation python] que l'étalonnage de la caméra fisheye n'est pas inclus dans cv2. Dans ce cas, abandonnez le traitement en Python et le code en C ++.
Seule la parallélisation stéréo nécessite la fonctionnalité de l'espace de noms cv :: fisheye. Une fois la parallélisation stéréo terminée, tout ce que vous avez à faire est de dériver l'image de parallaxe comme précédemment.
L'article suivant contient le code du cas fisheye. Exemple de code d'étalonnage de caméra OpenCV
Omnidirectional Camera Calibration Avec les caméras omnidirectionnelles, qui ont un angle plus large que les caméras fish-eye, la parallélisation stéréo devient plus difficile.
YouTube OpenCV GSoC 2015 Omnidirectional Camera Calibration
“Omnidirectional Cameras Calibration and Stereo 3D Reconstruction” – opencv_contrib/ccalib module (Baisheng Lai, Bo Li)
Davide Scaramuzza Omnidirectional Camera pdf
Il existe différentes méthodes pour les caméras fish-eye car l'expression relationnelle entre R et θ est différente. Veuillez vous référer à l'URL suivante. Vous devez vérifier laquelle des multiples méthodes suivantes est prise en charge par le code source dans opencv_contrib.
Projection d'équidistance Projection d'angle Equisolid Projection orthographique
Différence de méthode de projection
[Objectif fisheye conventionnel (H180) Objectif fisheye nouvellement étudié (TY180)] (http://www.mvision.co.jp/mcm320fish.html)
[Design Wave MAGAZINE] Numéro de septembre 2008 [Magazine]](http://books.rakuten.co.jp/rb/7848928/) [Projet prioritaire] Recherche sur les lentilles fish-eye qui ont commencé à être installées dans les voitures -La comparaison des différentes méthodes de projection et de la méthode de conversion mutuelle est un article de 15 pages. La description de la méthode est détaillée et la méthode de conversion de l'apparence de l'image entre les méthodes est également décrite.
En conclusion, il vaut mieux utiliser la grille circulaire. La raison est simple: la grille circulaire a une plus grande précision dans le calcul des coordonnées des points caractéristiques à l'étape 2. Étant donné qu'une ellipse (y compris un cercle) a la caractéristique d'être une ellipse même lorsqu'elle est vue sous un angle, les coordonnées du point caractéristique peuvent être obtenues avec précision en utilisant le centre de gravité comme point caractéristique. En revanche, dans le cas d'une grille carrée, le point caractéristique est l'intersection de lignes droites. Vu sous un angle, la forme du carré est déformée et il n'est pas possible d'obtenir des coordonnées stables.
[cv2.findCirclesGridDefault(image, patternSize[, centers[, flags]]) ] (http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findcirclesgrid)
garbage in garbage out La correspondance stéréo est une mesure. De bons résultats ne seront obtenus que si l'image est prise dans un état approprié pour la mesure. Alignez la luminosité des caméras gauche et droite (désactivez le gain automatique). Placez l'image dans la plage de valeurs de luminosité appropriée (extrêmement lumineuse, noircie). Modifiez la texture de l'image (évitez les images trop plates). Ces choses ne sont pas de la programmation, mais vous ne pouvez pas les ignorer et obtenir de bons résultats. Je vais le répéter. La correspondance stéréo est une mesure. La qualité des données d'entrée pour la correspondance stéréo change en fonction des conditions du sujet lors de la prise de vue et des conditions de prise de vue de l'appareil photo. Quelle que soit la qualité du programme lui-même, si la qualité des données d'entrée est mauvaise, seuls de mauvais résultats seront obtenus. C'est "poubelle dans les ordures".
La compréhension des caméras stéréo est fortement influencée par l'expérience de la mesure 3D, qui est un peu différente des autres parties de traitement d'image et de reconnaissance d'image. Même ceux qui maîtrisent le traitement d'image normal peuvent avoir du mal à maîtriser le grand nombre d'arguments des fonctions d'appariement stéréo.
--Comment calibrer la caméra avec python + opencv → correspondance stéréo → mesurer la profondeur http://russeng.hatenablog.jp/entry/2015/07/02/080515
—— Restauration multi-vues d'images 3D et résumé de la vision stéréo http://qiita.com/sobeit@github/items/d419ea39b06e43e6200f
Est également écrit de manière facile à comprendre.
slideshare Stefano Mattoccia「 Stereo Vision: Algorithms and Applications」 Stefano Mattoccia DEIS University of Bologna 214 pages Est une diapositive assez détaillée. Il est difficile de trouver une explication aussi détaillée dans un livre de reconnaissance d'image.
Comment créer une caméra stéréo
Semi-Global Matching with Jetson TK1
Calibrage de haute précision de la caméra à objectif fish-eye avec motif en bande http://www.iim.cs.tut.ac.jp/~kanatani/papers/fisheyecalib.pdf
Il est bien connu que les différences de valeurs de luminosité aggravent les résultats de la correspondance stéréo. En guise de contre-mesure, il est envisagé de modifier l'histogramme. [Suppression for Luminance Difference of Stereo Image-Pair Based on Improved Histogram Equalization ] http://onlinepresent.org/proceedings/vol6_2012/17.pdf
Avantages de la conversion CENSUS • Les valeurs de luminosité ne sont pas comparées directement, c'est donc bon pour les fluctuations d'éclairage - Comparé en fonction de la relation relative avec le centre • Fort contre le bruit - Les valeurs binaires sont comparées, donc il y a peu de réflexion du bruit infime • Cartographie stable dans les zones avec peu de motifs - Effet de l'accentuation des bords (motifs) en raison d'effets tels que la différence par rapport au centre → la différenciation http://www.slideshare.net/FukushimaNorishige/popcnt
Postscript
Recommended Posts