# -*- 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()
# -*- 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()
# -*- coding: utf-8 -*- Created on Wed Jun 13 18:48:48 2018  @author: mesutpiskin # Santraç tahtasının satır ve sütün sayısı # Kendi içerisinde yinelemeli olarak çalışan algoritmalar için durdurma/karar verme ölçütü # İhtiyaç duyacağımız değişkenler # Varsayılan kameraya bağlanır # 10 defa başarılı kalibrasyon yapılana kadar tekrarlansın # Kameradan bir frame alıp bunu gri renk uzayına çevirir # Frame içerisindeki santraç tahtasının köşelerini bul # Köşeler bulunabildi mi? 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. # Elde ettiğimiz bu noktaları saklayalım # Testip edilen köşeleri çizelim # Elde ettiğimiz K ve D değerlerini npz arşivi olarak kaydedelim (txt, xml, yaml da kullanabilirsiniz) # Kalibrasyon verilerini kullanarak görüntüyü düzeltelim # Gri renk uzayında frame okuyalım 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.