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

Récemment, j'ai été fasciné par la facilité d'écriture du code Python, et j'ai beaucoup écrit des exemples de programmes en Python.

Donc, le sujet du titre. Je peux utiliser des yeux de poisson ou des objectifs super grand angle pour mes futurs travaux, donc si j'essaie de faire un échantillon d'essai, Il semble que la version Python n'ait pas le cv :: fisheye I / F qui existe dans la version C ++ d'OpenCV. .. ..

Je ne pouvais pas abandonner de différentes manières, alors j'ai pris le tour de l'étalonnage normal avec Python. J'ai essayé de calibrer l'objectif fisheye. (Si vous pouvez le faire avec la version Python, il n'y aura pas de problème technique si vous l'implémentez correctement avec la version C ++.

Ci-dessous, vidéo YouTube ↓ https://www.youtube.com/watch?v=WGtZeyfzve4 [[Windows] [Python] Calibrage de la caméra de l'objectif fisheye avec OpenCV](https://www.youtube.com/watch? v = WGtZeyfzve4)

cette? Est-ce quelque chose que vous pouvez faire normalement? Confirmation requise. De plus, je n'ai pas l'impression qu'il y a beaucoup d'endroits où mes sentiments sont coupés. Probablement un grand angle d'environ 130 degrés peut être obtenu.

Au fait, la caméra utilisée est en dessous ↓ https://www.amazon.co.jp/ELP-USB2-0-Ominivison-OV2710-%E5%BA%A6%E3%83%A1%E3%82%AC%E3%83%94%E3%82%AF%E3%82%BB%E3%83%AB%E9%AD%9A%E7%9C%BC%E3%83%AC%E3%83%B3%E3%82%BA/dp/B017R02JLI DSC_0267.JPG

Collez le code ci-dessous ↓

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import cv2
import Tkinter
import tkMessageBox

square_side_length = 23.0 #La taille d'un côté du carré dans l'échiquier(mm)
grid_intersection_size = (10, 7) #Nombre de grilles dans l'échiquier

pattern_points = np.zeros( (np.prod(grid_intersection_size), 3), np.float32 )
pattern_points[:,:2] = np.indices(grid_intersection_size).T.reshape(-1, 2)
pattern_points *= square_side_length
object_points = []
image_points = []

root = Tkinter.Tk()
root.withdraw()

video_input = cv2.VideoCapture(1)
if (video_input.isOpened() == False):
    exit()

camera_mat, dist_coef = [], []

if tkMessageBox.askyesno('askyesno','Données d'étalonnage(K.csv, d.csv)Voulez-vous lire?'):
    #Lecture des données d'étalonnage
    camera_mat = np.loadtxt('K.csv', delimiter=',')
    dist_coef = np.loadtxt('d.csv', delimiter=',')
    print "K = \n", camera_mat
    print "d = ", dist_coef.ravel()
else:
    #Échiquier de tir
    capture_count = 0
    while(True):
        ret, frame = video_input.read()

        #Convertir en image en niveaux de gris pour la détection de l'échiquier
        #grayscale_image = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)

        #Détecte les coins de l'échiquier
        #found, corner = cv2.findChessboardCorners(grayscale_image, grid_intersection_size)
        found, corner = cv2.findChessboardCorners(frame, grid_intersection_size)

        if found == True:
            print 'findChessboardCorners : True'

            #Trouver des coins d'échecs dans l'OpenCV actuel()À l'intérieur, cornerSubPix()Un traitement considérable est-il en cours? Confirmation requise
            #term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1)
            #cv2.cornerSubPix(grayscale_image, corner, (5,5), (-1,-1), term)
            #cv2.drawChessboardCorners(grayscale_image, grid_intersection_size, corner, found)

            cv2.drawChessboardCorners(frame, grid_intersection_size, corner, found)
        if found == False:
            print 'findChessboardCorners : False'

        cv2.putText(frame, "Enter:Capture Chessboard(" + str(capture_count) + ")", (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1)
        cv2.putText(frame, "N    :Completes Calibration Photographing", (100, 75), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1)
        cv2.putText(frame, "ESC  :terminate program", (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1)
        #cv2.putText(grayscale_image, "Enter:Capture Chessboard(" + str(capture_count) + ")", (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1)
        #cv2.putText(grayscale_image, "ESC  :Completes Calibration Photographing.", (100, 75), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1)
        cv2.imshow('original', frame)
        #cv2.imshow('findChessboardCorners', grayscale_image)

        c = cv2.waitKey(50) & 0xFF
        if c == 13 and found == True: # Enter
            #Ajout d'informations sur la détection des coins de l'échiquier
            image_points.append(corner)
            object_points.append(pattern_points)
            capture_count += 1
        if c == 110: # N
            if tkMessageBox.askyesno('askyesno','Voulez-vous terminer le tournage de l'échiquier et trouver les paramètres internes de la caméra?'):
                cv2.destroyAllWindows()
                break
        if c == 27: # ESC
            if tkMessageBox.askyesno('askyesno','Voulez-vous quitter le programme?'):
                video_input.release()
                cv2.destroyAllWindows()
                exit()

    if len(image_points) > 0:
        #Calculer les paramètres internes de la caméra
        print 'calibrateCamera() start'
        rms, K, d, r, t = cv2.calibrateCamera(object_points,image_points,(frame.shape[1],frame.shape[0]),None,None)
        print "RMS = ", rms
        print "K = \n", K
        print "d = ", d.ravel()
        np.savetxt("K.csv", K, delimiter =',',fmt="%0.14f") #Enregistrer la matrice de la caméra
        np.savetxt("d.csv", d, delimiter =',',fmt="%0.14f") #Préservation du coefficient de déformation

        camera_mat = K
        dist_coef = d

        #Évaluation par erreur de reprojection
        mean_error = 0
        for i in xrange(len(object_points)):
            image_points2, _ = cv2.projectPoints(object_points[i], r[i], t[i], camera_mat, dist_coef)
            error = cv2.norm(image_points[i], image_points2, cv2.NORM_L2) / len(image_points2)
            mean_error += error
        print "total error: ", mean_error/len(object_points) #Une valeur proche de 0 est souhaitable(Ne convient pas à l'évaluation des objectifs fisheye?)
    else:
        print "findChessboardCorners() not be successful once"

#Affichage de l'image de correction de la distorsion
if camera_mat != []:
    while(True):
        ret, frame = video_input.read()
        undistort_image = cv2.undistort(frame, camera_mat, dist_coef)

        cv2.imshow('original', frame)
        cv2.imshow('undistort', undistort_image)
        c = cv2.waitKey(50) & 0xFF
        if c==27: # ESC
            break

video_input.release()
cv2.destroyAllWindows()

c'est tout.

Recommended Posts

[Windows] [Python] Calibrage de la caméra de l'objectif fisheye avec OpenCV
Capture de caméra avec Python + OpenCV
Reconnaissance faciale avec caméra avec opencv3 + python2.7
Etude de base d'OpenCV avec Python
Acquisition d'images depuis une caméra avec Python + OpenCV
Comparaison des performances du détecteur de visage avec Python + OpenCV
Installez OpenCV 4.0 et Python 3.7 sur Windows 10 avec Anaconda
Binarisation avec OpenCV / Python
Python à partir de Windows 7
Capture de caméra Python, OpenCV
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
Essayez de projeter la conversion d'image en utilisant OpenCV avec Python
Récapitulatif des outils d'exploitation de l'interface graphique Windows avec Python
Afficher l'image de la caméra USB avec OpenCV de Python avec Raspeye
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
Python avec VSCode (Windows 10)
Exécutez python avec PyCharm (Windows)
"Traitement Apple" avec OpenCV3 + Python3
Édition d'image avec python OpenCV
[Python] Utilisation d'OpenCV avec Python (basique)
Détection de visage avec Python + OpenCV
Synchronisation de l'heure (Windows) avec Python
Utiliser OpenCV avec Python @Mac
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
Estimer la posture du marqueur AR avec Python + OpenCV + drone
[Python] Lecture facile des fichiers image du numéro de série avec OpenCV
Construction d'environnement de python et opencv
Briller la vie avec Python et OpenCV
Détection de visage avec YOLO Face (Windows10, Python3.6)
Utiliser la caméra Point Grey avec Python (PyCapture2)
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Réseau neuronal avec OpenCV 3 et Python 3
L'extraction de couleur avec Python + OpenCV a résolu le mystère du fond vert
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
[Python] Utilisation d'OpenCV avec Python (détection des bords)
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Premiers pas avec Python Bases de Python
Programmation facile Python + OpenCV avec Canopy
Jeu de vie avec Python! (Le jeu de la vie de Conway)
Construire mlpy avec python3.3 (64 bits) (Windows 64 bits)
10 fonctions du "langage avec batterie" python
Installation de Python, SciPy, matplotlib (Windows)
Découpez le visage avec Python + OpenCV
Charger une image gif avec Python + OpenCV
Utiliser le fichier d'étalonnage de la caméra avec OpenCvSharp4
Implémentation de la méthode Dyxtra par python
Trouver la similitude d'image avec Python + OpenCV
Dessinez une illustration avec Python + OpenCV
Premiers pas avec Python 3.8 sous Windows
Coexistence de Python2 et 3 avec CircleCI (1.0)
Suivre les balles de baseball avec Python + OpenCV
[Python] Création de plusieurs fenêtres avec Tkinter
Segmentation basée sur un graphique avec Python + OpenCV
Dessinez une flèche (vecteur) avec opencv / python
Le moyen le plus rapide d'obtenir régulièrement des images de caméra avec opencv de python
[OpenCV; Python] Résumé de la fonction findcontours
Comment couper la partie inférieure droite de l'image avec Python OpenCV
Créez votre propre caméra virtuelle avec Python + OpenCV et appliquez des effets originaux
Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python
Bases du traitement d'images binarisées par Python