[Windows] [Python] Kamerakalibrierung des Fischaugenobjektivs mit OpenCV

Vor kurzem war ich fasziniert von der Leichtigkeit, Python-Code zu schreiben, und ich habe ziemlich viel Beispielprogramme in Python geschrieben.

Also das Thema des Titels. Ich kann in meiner zukünftigen Arbeit Fischaugen oder Superweitwinkelobjektive verwenden. Wenn ich also versuche, eine Probe zu machen, Es scheint, dass die Python-Version nicht die cv :: fisheye I / F enthält, die in der C ++ - Version von OpenCV vorhanden ist. .. ..

Ich konnte auf verschiedene Weise nicht aufgeben, also wechselte ich zur normalen Kalibrierung mit Python. Ich habe versucht, das Fischaugenobjektiv zu kalibrieren. (Wenn Sie dies mit der Python-Version tun können, gibt es kein technisches Problem, wenn Sie es ordnungsgemäß mit der C ++ - Version implementieren.

Unten YouTube-Video ↓ https://www.youtube.com/watch?v=WGtZeyfzve4 [[Windows] [Python] Kamerakalibrierung des Fischaugenobjektivs mit OpenCV](https://www.youtube.com/watch? v = WGtZeyfzve4)

Das? Kannst du das normalerweise tun? Bestätigung erforderlich. Ich habe auch nicht das Gefühl, dass es viele Orte gibt, an denen meine Gefühle abgeschnitten sind. Wahrscheinlich kann ein Weitwinkel von ca. 130 Grad gesichert werden.

Die verwendete Kamera befindet sich übrigens unter ↓ 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

Fügen Sie den folgenden Code ein ↓

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

import numpy as np
import cv2
import Tkinter
import tkMessageBox

square_side_length = 23.0 #Die Größe einer Seite des Quadrats im Schachbrett(mm)
grid_intersection_size = (10, 7) #Anzahl der Gitter im Schachbrett

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','Kalibrierungsdaten(K.csv, d.csv)Willst du lesen'):
    #Kalibrierdaten lesen
    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:
    #Schießbrett schießen
    capture_count = 0
    while(True):
        ret, frame = video_input.read()

        #Zur Erkennung von Schachbrettern in Graustufenbilder konvertieren
        #grayscale_image = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)

        #Erkennt Schachbrettecken
        #found, corner = cv2.findChessboardCorners(grayscale_image, grid_intersection_size)
        found, corner = cv2.findChessboardCorners(frame, grid_intersection_size)

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

            #Finde Chessboard Corners im aktuellen OpenCV()Innerhalb von CornerSubPix()Wird eine beträchtliche Verarbeitung durchgeführt? Bestätigung erforderlich
            #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
            #Informationen zur Erkennung von Schachbrettecken hinzugefügt
            image_points.append(corner)
            object_points.append(pattern_points)
            capture_count += 1
        if c == 110: # N
            if tkMessageBox.askyesno('askyesno','Möchten Sie das Schachbrett-Shooting beenden und die internen Parameter der Kamera ermitteln?'):
                cv2.destroyAllWindows()
                break
        if c == 27: # ESC
            if tkMessageBox.askyesno('askyesno','Möchten Sie das Programm beenden?'):
                video_input.release()
                cv2.destroyAllWindows()
                exit()

    if len(image_points) > 0:
        #Berechnen Sie die internen Parameter der Kamera
        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") #Kameramatrix speichern
        np.savetxt("d.csv", d, delimiter =',',fmt="%0.14f") #Erhaltung des Dehnungskoeffizienten

        camera_mat = K
        dist_coef = d

        #Auswertung durch Reprojektionsfehler
        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) #Ein Wert nahe 0 ist wünschenswert(Nicht zur Beurteilung von Fischaugenlinsen geeignet?)
    else:
        print "findChessboardCorners() not be successful once"

#Bildanzeige zur Verzerrungskorrektur
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()

das ist alles.

Recommended Posts

[Windows] [Python] Kamerakalibrierung des Fischaugenobjektivs mit OpenCV
Kameraerfassung mit Python + OpenCV
Gesichtserkennung mit Kamera mit opencv3 + python2.7
Grundlegendes Studium von OpenCV mit Python
Bildaufnahme von der Kamera mit Python + OpenCV
Leistungsvergleich des Gesichtsdetektors mit Python + OpenCV
Installieren Sie OpenCV 4.0 und Python 3.7 unter Windows 10 mit Anaconda
Binarisierung mit OpenCV / Python
Python ab Windows 7
Python, OpenCV-Kameraerfassung
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Versuchen Sie, die Bildkonvertierung mit OpenCV mit Python zu projizieren
Zusammenfassung der Tools zum Betreiben der Windows-Benutzeroberfläche mit Python
Zeigen Sie das Bild der USB-Kamera mit OpenCV von Python mit Raspeye an
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Python mit VSCode (Windows 10)
Führen Sie Python mit PyCharm aus (Windows)
"Apple-Verarbeitung" mit OpenCV3 + Python3
Bildbearbeitung mit Python OpenCV
[Python] Verwenden von OpenCV mit Python (Basic)
Gesichtserkennung mit Python + OpenCV
Zeitsynchronisation (Windows) mit Python
Verwenden von OpenCV mit Python @Mac
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Schätzen Sie die Haltung des AR-Markers mit Python + OpenCV + Drohne
[Python] Mit OpenCV können Sie problemlos Bilddateien mit Seriennummern lesen
Umgebungskonstruktion von Python und OpenCV
Leuchtendes Leben mit Python und OpenCV
Gesichtserkennung mit YOLO Face (Windows10, Python3.6)
Verwenden Sie eine Point Grey-Kamera mit Python (PyCapture2).
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
Neuronales Netzwerk mit OpenCV 3 und Python 3
Die Farbextraktion mit Python + OpenCV löste das Rätsel des grünen Hintergrunds
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
[Python] Verwenden von OpenCV mit Python (Kantenerkennung)
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Erste Schritte mit Python Grundlagen von Python
Einfache Python + OpenCV-Programmierung mit Canopy
Lebensspiel mit Python! (Conways Spiel des Lebens)
Erstellen Sie mlpy mit python3.3 (64bit) (Windows 64bit)
10 Funktionen von "Sprache mit Batterie" Python
Installation von Python, SciPy, matplotlib (Windows)
Schneiden Sie das Gesicht mit Python + OpenCV aus
Laden Sie das GIF-Bild mit Python + OpenCV
Verwenden Sie die Kamerakalibrierungsdatei mit OpenCvSharp4
Implementierung der Dyxtra-Methode durch Python
Finden Sie Bildähnlichkeit mit Python + OpenCV
Zeichnen Sie eine Illustration mit Python + OpenCV
Erste Schritte mit Python 3.8 unter Windows
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Verfolgen Sie Baseballbälle mit Python + OpenCV
[Python] Erstellen mehrerer Fenster mit Tkinter
Graphbasierte Segmentierung mit Python + OpenCV
Zeichnen Sie einen Pfeil (Vektor) mit opencv / python
Der schnellste Weg, um regelmäßig Kamerabilder mit Pythons OpenCV zu erhalten
[OpenCV; Python] Zusammenfassung der Funktion findcontours
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
Erstellen Sie mit Python + OpenCV Ihre eigene virtuelle Kamera und wenden Sie Originaleffekte an
Erhalten und schätzen Sie die Form des Kopfes mit Dlib und OpenCV mit Python
Grundlagen der binärisierten Bildverarbeitung durch Python