Supplément à "Calibration de la caméra" des didacticiels OpenCV-Python

Le supplément aux Tutoriels OpenCV-Python "Calibration de la caméra" a été réécrit en un article séparé.

** Signification de la matrice de caméra **

[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.

Scripts situés dans (répertoire opencv_3) \ sources \ samples \ python

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. meshlab_half.png

La figure montre les coordonnées 3D générées dans stereo_match.py affichées dans MeshLab.

aloe画像 Il était difficile de remarquer que le tissu derrière le avait un changement de profondeur comme cet écran 3D. aloe画像とdepth画像

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 à.

** Exemples de programmes associés dans OpenCV-C ++ (système stéréo / système d'étalonnage de caméra) **

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.

** Pour appareil photo fisheye **

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.

Fisheye Projection

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.

[Windows] [Python] Calibrage de la caméra de l'objectif fisheye avec OpenCV


** Lequel dois-je utiliser, grille carrée ou grille circulaire? **

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".

** Comprendre les caméras stéréo à partir du principe **

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

** Contre-mesures contre la possibilité d'une erreur d'alignement dans l'algorithme SAD en cas de différence de luminosité entre les caméras gauche et droite **

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

SlideShare SSII2019TS: Calibration de caméra pratique - Bases et applications de la mesure du monde réel à l'aide de caméras-

Recommended Posts

Supplément à "Calibration de la caméra" des didacticiels OpenCV-Python
Ajout d'OpenCV-Python et de Scikit-image aux "incontournables" Tutoriels OpenCV-Python "2"
Je veux imprimer dans la notation d'inclusion
Calibrage de la caméra
Comment obtenir stacktrace en python
[V11 ~] Un mémorandum à mettre dans Misskey
Créez un modèle d'échiquier pour l'étalonnage de la caméra
Calculons en fait le problème statistique avec Python
Comment effacer un taple dans une liste (Python)
Comment incorporer des variables dans des chaînes python
Je veux créer une fenêtre avec Python
Comment créer un fichier JSON en Python
Une manière intelligente de chronométrer le traitement avec Python
Comment implémenter un sélecteur de dégradé dans Houdini
Étapes pour développer une application Web en Python
Pour ajouter un module à python que vous mettez dans Julialang
Comment notifier les canaux Discord en Python
Calibrage et utilisation de la caméra avec opencv-python [méthode chang]
[Python] Comment dessiner un histogramme avec Matplotlib
Comment créer une API Rest dans Django
Comment écrire un document tuple nommé en 2020
Comment compter les nombres dans une plage spécifique
Comment lire des fichiers dans différents répertoires
Comment se moquer d'une fonction publique dans Pytest
"Tutoriels OpenCV-Python" 2 incontournables
"Tutoriels OpenCV-Python" incontournables
Comment spécifier un schéma dans les paramètres de la base de données Django
Analyser une chaîne JSON écrite dans un fichier en Python
Comment convertir / restaurer une chaîne avec [] en python
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Essayez de créer un module Python en langage C
Je veux écrire en Python! (2) Écrivons un test
[Python] Comment développer des variables dans une chaîne de caractères
Créer un plugin pour exécuter Python Doctest sur Vim (2)
J'ai fait un script pour mettre un extrait dans README.md
J'ai essayé d'implémenter un pseudo pachislot en Python
Créez un plug-in pour exécuter Python Doctest avec Vim (1)
Un mémorandum pour exécuter un script python dans un fichier bat
Je veux échantillonner au hasard un fichier avec Python
Je veux travailler avec un robot en python.
Comment afficher DataFrame sous forme de tableau dans Markdown
Que faire si une erreur de décodage Unicode se produit dans pip
Pratique pour utiliser les sous-graphiques matplotlib dans l'instruction for
Introduction à l'algèbre linéaire avec Python: Décomposition A = LU
[Python] Création d'une méthode pour convertir la base en 1 seconde
Comment exécuter une commande à l'aide d'un sous-processus en Python
Correction d'un moyen pour l'UEFI de forcer Windows à démarrer
Sortie d'un vidage binaire en binaire et retour dans un fichier binaire
Comment référencer des fichiers statiques dans un projet Django
2 façons de lire tous les fichiers csv dans un dossier
Publier / télécharger une bibliothèque créée en Python vers PyPI
[Linux] Comment mettre votre IP dans une variable