-
Notifications
You must be signed in to change notification settings - Fork 91
/
kamera-kalibrasyonu.py
79 lines (62 loc) · 2.77 KB
/
kamera-kalibrasyonu.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# -*- coding: utf-8 -*-
"""
Created on Wed Jun 13 18:48:48 2018
@author: mesutpiskin
"""
import cv2
import numpy as np
# Santraç tahtasının satır ve sütün sayısı
rows = 9
cols = 6
# Kendi içerisinde yinelemeli olarak çalışan algoritmalar için durdurma/karar verme ölçütü
criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 30, 0.001)
# İhtiyaç duyacağımız değişkenler
objectPoints = np.zeros((rows * cols, 3), np.float32)
objectPoints[:, :2] = np.mgrid[0:rows, 0:cols].T.reshape(-1, 2)
objectPointsArray = []
imgPointsArray = []
capture = cv2.VideoCapture(0) # Varsayılan kameraya bağlanır
found = 0
# 10 defa başarılı kalibrasyon yapılana kadar tekrarlansın
while(found < 10):
# Kameradan bir frame alıp bunu gri renk uzayına çevirir
retCam,img = capture.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Frame içerisindeki santraç tahtasının köşelerini bul
isSucces, corners = cv2.findChessboardCorners(gray, (rows, cols), None)
# Köşeler bulunabildi mi?
if isSucces:
'''
Eğer belirttiğimiz satır ve sütün sayısınca köşe doğru olarak tespit edilmişse
cornerSubPix() metodu ile köşelerin veya radyal sırt noktalarının alt pikselinin,
doğru konumunu bulmak için kendi içerisinde yineler.
'''
corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
# Elde ettiğimiz bu noktaları saklayalım
objectPointsArray.append(objectPoints)
imgPointsArray.append(corners)
# Testip edilen köşeleri çizelim
cv2.drawChessboardCorners(img, (rows, cols), corners, isSucces)
found += 1
cv2.imshow('Kalibrasyon', img)
cv2.waitKey(500)
cv2.destroyAllWindows()
# Elde ettiğimiz K ve D değerlerini npz arşivi olarak kaydedelim (txt, xml, yaml da kullanabilirsiniz)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objectPointsArray, imgPointsArray, gray.shape[::-1], None, None)
np.savez('calibrationdata.npz', mtx=mtx, dist=dist, rvecs=rvecs, tvecs=tvecs)
# Kalibrasyon verilerini kullanarak görüntüyü düzeltelim
cap = cv2.VideoCapture(0)
while True:
# Gri renk uzayında frame okuyalım
ret3,img = cap.read()
h, w = img.shape[:2]
'''
Kalibrasyon ile elde ettiğimiz K ve D verileri ve OpenCV undistort* metotlarını kullanarak
bozuk görüntüyü düzeltebiliriz. Bu metotlar parametre olarak K ve D verilerine ihtiyaç duyar,
sonuç olarak ise size düzeltilmiş görüntü dönecektir.
'''
newCameraMtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
undistortedImg = cv2.undistort(img, mtx, dist, None, newCameraMtx)
cv2.imshow('Duzeltilmis Goruntu', undistortedImg)
cv2.waitKey(0)
cv2.destroyAllWindows()