aktuell befasse ich mich mit WetterPrädiktion über Bildverarbeitung in meinem Studium, dafür muss ich die aufgenommen Bilder einer Weitwinkelkamera entzerren. Meine einziges Problem aktuell ist, dass ich gerne die berechneten Matrizen und Vektoren zur Entzerrung gerne abspeichern würde, da diese sich nicht ändern und somit nicht immer wieder neu berechnet werden müssen. Logischer Ablauf ist also 1. Einlesen der Bilder 2. Kalibrierungsmatrix berechnen 3. Entzerren des Bildes 4. Ausgabe relativer Fehler .
Was ist denn der "Beste" bzw. einfachste Weg die Werte "cameraMatrix, dist, rvecs, tvecs" abzuspeichern, dass diese nicht verloren gehen aber bei Bedarf von der Kalbrierungsfunktion "camera_calibration" geändert werden könnten.Ich bin recht neu in Python selbst, habe vorher eher C++ gentuzt aber auch nicht immens viel.
Code: Alles auswählen
import numpy as np
import cv2 as cv
import glob
# FIND CHESSBOARD CORNERS - OBJECT POINTS AND IMAGE POINTS
chessboardSize = (9, 6)
frameSize = (2000, 1500)
# termination criteria
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001) # GENAUIGKEIT BEACHTEN
# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((chessboardSize[0] * chessboardSize[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboardSize[0], 0:chessboardSize[1]].T.reshape(-1, 2)
size_of_chessboard_squares_mm = 20
objp = objp * size_of_chessboard_squares_mm
# 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') # Kalibrierungsbilder müssen im selber Ordner liegen wie Programm
# [b]Calibration Variables Globale Adressierung
cameraMatrix = None
dist = None
rvecs = None
tvecs = None[/b]
def read_in_for_calibration():
for image in images:
img = cv.imread(image)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# Find the chess board corners
ret, corners = cv.findChessboardCorners(gray, chessboardSize, 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(corners)
# Draw and display the corners
# cv.drawChessboardCorners(img, chessboardSize, corners2, ret)
# cv.imshow('img', img)
# cv.waitKey(1000)
cv.destroyAllWindows()
# CALIBRATION
[b]def camera_calibration():
global cameraMatrix, dist, rvecs, tvecs
ret, cameraMatrix, dist, rvecs, tvecs = cv.calibrateCamera(objpoints, imgpoints, frameSize, None, None)[/b]
print("Camera Calibrated: ", ret)
print("\nCamera Matrix:\n", cameraMatrix)
print("\nDistortion Paramaters:\n", dist)
print("\nRotation Vector: \n", rvecs)
print("\nTranslation Vector: \n", tvecs)
def undistortion():
# UNDISTORTION
img = cv.imread('100GOPRO-GOPR0147.JPG')
h, w = img.shape[:2]
newCameraMatrix, roi = cv.getOptimalNewCameraMatrix(cameraMatrix, dist, (w, h), 1, (w, h))
# Undistort
dst = cv.undistort(img, cameraMatrix, dist, None, newCameraMatrix)
# crop the image
x, y, w, h = roi
dst = dst[y:y + h, x:x + w]
cv.imwrite('caliResult1.png', dst)
def reproject_error():
# Reprojection Error
mean_error = 0
for i in range(len(objpoints)):
imgpoints2, _ = cv.projectPoints(objpoints[i], rvecs[i], tvecs[i], cameraMatrix, dist)
error = cv.norm(imgpoints[i], imgpoints2, cv.NORM_L2) / len(imgpoints2)
mean_error += error
print("total error: {}".format(mean_error / len(objpoints)))
read_in_for_calibration()
camera_calibration()
undistortion()
reproject_error()
Code: Alles auswählen
class DistortionValues():
"""Values for function 'Undistortion' to reduce calcuation time """
def __init__(self, cameraMatrix, dist, rvecs,tvecs):
self.cameraMatrix = None
self.dist = None
self.rvecs = None
self.tvecs = None