def calibrationExample():
    camNum =0           # The number of the camera to calibrate
    nPoints = 5        # number of images used for the calibration (space presses)
    patternSize=(9,6)   #size of the calibration pattern
    #saveImage = 'calibrationShoots'

    #calibrated, camera_matrix,dist_coefs,rms = SIGBTools.calibrateCamera(camNum,nPoints,patternSize,saveImage)
    
    #np.save('PMatrix', camera_matrix)
    #np.save('distCoef',dist_coefs)
    
    camera_matrix = np.load('Results/PMatrix.npy')
    dist_coefs = np.load('Results/distCoef.npy')
    calibrated = True
    
    K = camera_matrix
    cam1 = SIGBTools.Camera( np.hstack((K,np.dot(K,np.array([[0],[0],[-1]])) )) )
    cam1.factor()
    #Factor projection matrix into intrinsic and extrinsic parameters
    print "K=",cam1.K
    print "R=",      cam1.R
    print "t",cam1.t
    
    if (calibrated):
        capture = cv2.VideoCapture(camNum)
        running = True
        while running:
            running, img =capture.read()
            imgGray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            
            ch = cv2.waitKey(1)
            if(ch==27) or (ch==ord('q')): #ESC
                running = False
            img=cv2.undistort(img, camera_matrix, dist_coefs )
            found,corners=cv2.findChessboardCorners(imgGray, patternSize  )
            if (found!=0):
                cv2.drawChessboardCorners(img, patternSize, corners,found)
            cv2.imshow("Calibrated",img)
def AugumentSequence():
    #Loading callibration matrix
    K = np.load('Results/PMatrix.npy') 
    #setting pattern size
    pattern_size = (9,6)
    #loading calibration images
    L_CP = cv2.imread('Results/L_CPSeq.jpg') #Frontal view
    #Getting cube points from cubePoints.py
    cubePoints = cube.cube_points([0,0,0.1],0.1)
    #Getting chesscorners for frontal view
    Fgray = cv2.cvtColor(L_CP,cv2.COLOR_BGR2GRAY)
    Ffound, Fcorners = cv2.findChessboardCorners(Fgray, pattern_size)
    FchessCorners = [(Fcorners[0,0,0],Fcorners[0,0,1]),(Fcorners[8,0,0],Fcorners[8,0,1]),(Fcorners[45,0,0],Fcorners[45,0,1]),(Fcorners[53,0,0],Fcorners[53,0,1])]
    #To open CV format
    FchessCorners = np.array([[x,y] for (x,y) in FchessCorners])
    #Getting chesscorners for the sequence images
    cap = cv2.VideoCapture(0)
    running, I = cap.read()
    #Get camera model for first view 
    cam1 = SIGBTools.Camera(hstack((K,dot(K,array([[0],[0],[-1]])) )) )
    
    #imSize = np.shape(I)
    #videoWriter = cv2.VideoWriter("sequence.mp4", cv.FOURCC('D','I','V','X'), 30,(imSize[1], imSize[0]),True)
    
    while(running):
        running, I = cap.read()
        #converting to gray for better contrast
        gray = cv2.cvtColor(I,cv2.COLOR_BGR2GRAY)
        found, corners = cv2.findChessboardCorners(gray, pattern_size)
        
        if (found):
        #picking utmost corners
            IchessCorners = [(corners[0,0,0],corners[0,0,1]),(corners[8,0,0],corners[8,0,1]),(corners[45,0,0],corners[45,0,1]),(corners[53,0,0],corners[53,0,1])]
            #To openCV format
            IchessCorners = np.array([[x,y] for (x,y) in IchessCorners])
            #Find homography between frontal image and current frame
            H,mask = cv2.findHomography(FchessCorners, IchessCorners)
            #Transofrm camera view
            camFrame = SIGBTools.Camera(dot(H,cam1.P))
            A = dot(linalg.inv(K),camFrame.P[:,:3])
            A = array([A[:,0],A[:,1],cross(A[:,0],A[:,1])]).T
            camFrame.P[:,:3] = dot(K,A)
            #Get cube projection points
            box_peojection = camFrame.project(SIGBTools.toHomogenious(cubePoints))
            #Draw  box
            p = box_peojection
            ''' Drawing the box manually '''
            #bottom
            cv2.line(I, (int(p[0][1]), int(p[1][1])), (int(p[0][2]),int(p[1][2])),(255,255,0),2)
            cv2.line(I, (int(p[0][2]), int(p[1][2])), (int(p[0][3]),int(p[1][3])),(255,255,0),2)
            cv2.line(I, (int(p[0][3]), int(p[1][3])), (int(p[0][4]),int(p[1][4])),(255,255,0),2)
            cv2.line(I, (int(p[0][1]), int(p[1][1])), (int(p[0][4]),int(p[1][4])),(255,255,0),2)
            
            #connecting lines
            cv2.line(I, (int(p[0][4]), int(p[1][4])), (int(p[0][5]),int(p[1][5])),(255,255,0),2)
            cv2.line(I, (int(p[0][1]), int(p[1][1])), (int(p[0][6]),int(p[1][6])),(255,255,0),2)
            cv2.line(I, (int(p[0][2]), int(p[1][2])), (int(p[0][7]),int(p[1][7])),(255,255,0),2)
            cv2.line(I, (int(p[0][3]), int(p[1][3])), (int(p[0][8]),int(p[1][8])),(255,255,0),2)
            
            #top
            cv2.line(I, (int(p[0][5]), int(p[1][5])), (int(p[0][6]),int(p[1][6])),(255,255,0),2)
            cv2.line(I, (int(p[0][6]), int(p[1][6])), (int(p[0][7]),int(p[1][7])),(255,255,0),2)
            cv2.line(I, (int(p[0][7]), int(p[1][7])), (int(p[0][8]),int(p[1][8])),(255,255,0),2)
            cv2.line(I, (int(p[0][8]), int(p[1][8])), (int(p[0][9]),int(p[1][9])),(255,255,0),2)
            
            cv2.imshow('Augumentation',I)
            cv2.waitKey(1)
            
    return
def AugumentImages():
    #Loading callibration matrix
    K = np.load('Results/PMatrix.npy') 
    #setting pattern size
    pattern_size = (9,6)
    #loading calibration images
    L_CP = cv2.imread('Results/L_CP.jpg') #Frontal view
    #Getting cube points from cubePoints.py
    cubePoints = cube.cube_points([0,0,0.1],0.1)
    
    I1 = cv2.imread('Results/calibrationShoots1.jpg')
    I2 = cv2.imread('Results/calibrationShoots2.jpg')
    I3 = cv2.imread('Results/calibrationShoots3.jpg')
    I4 = cv2.imread('Results/calibrationShoots4.jpg')
    I5 = cv2.imread('Results/calibrationShoots5.jpg')
    
    Images = [I1, I2, I3, I4 ,I5]
    ImageH = [] #homographies from frontal view to H respectively
    
    #Getting chesscorners for frontal view
    Fgray = cv2.cvtColor(L_CP,cv2.COLOR_BGR2GRAY)
    Ffound, Fcorners = cv2.findChessboardCorners(Fgray, pattern_size)
    FchessCorners = [(Fcorners[0,0,0],Fcorners[0,0,1]),(Fcorners[8,0,0],Fcorners[8,0,1]),(Fcorners[45,0,0],Fcorners[45,0,1]),(Fcorners[53,0,0],Fcorners[53,0,1])]
    #To open CV format
    FchessCorners = np.array([[x,y] for (x,y) in FchessCorners])
    
    #Getting chesscorners for the rest of pics
    for I in Images:
        #converting to gray for better contrast
        gray = cv2.cvtColor(I,cv2.COLOR_BGR2GRAY)
        #finding all corners on chessboard
        found, corners = cv2.findChessboardCorners(gray, pattern_size)
        #picking utmost corners
        IchessCorners = [(corners[0,0,0],corners[0,0,1]),(corners[8,0,0],corners[8,0,1]),(corners[45,0,0],corners[45,0,1]),(corners[53,0,0],corners[53,0,1])]
        #To openCV format
        IchessCorners = np.array([[x,y] for (x,y) in IchessCorners])
        H,mask = cv2.findHomography(FchessCorners, IchessCorners)
        ImageH.append(H)
        
    cam1 = SIGBTools.Camera(hstack((K,dot(K,array([[0],[0],[-1]])) )) )
    box_cam1 = cam1.project(SIGBTools.toHomogenious(cubePoints[:,:5]))
    
    cam2 = SIGBTools.Camera(dot(ImageH[3],cam1.P))
    A = dot(linalg.inv(K),cam2.P[:,:3])
    A = array([A[:,0],A[:,1],cross(A[:,0],A[:,1])]).T
    cam2.P[:,:3] = dot(K,A)
    box_cam2 = cam2.project(SIGBTools.toHomogenious(cubePoints))
    print box_cam2
    #figure()
    #imshow(I4) 
    #plot(box_cam2[0,:],box_cam2[1,:],linewidth=3)
    #show()
    p=box_cam2
    
    ''' Drawing the box manually '''
    #bottom
    cv2.line(I4, (int(p[0][1]), int(p[1][1])), (int(p[0][2]),int(p[1][2])),(255,255,0),2)
    cv2.line(I4, (int(p[0][2]), int(p[1][2])), (int(p[0][3]),int(p[1][3])),(255,255,0),2)
    cv2.line(I4, (int(p[0][3]), int(p[1][3])), (int(p[0][4]),int(p[1][4])),(255,255,0),2)
    cv2.line(I4, (int(p[0][1]), int(p[1][1])), (int(p[0][4]),int(p[1][4])),(255,255,0),2)
    
    #connecting lines
    cv2.line(I4, (int(p[0][4]), int(p[1][4])), (int(p[0][5]),int(p[1][5])),(255,255,0),2)
    cv2.line(I4, (int(p[0][1]), int(p[1][1])), (int(p[0][6]),int(p[1][6])),(255,255,0),2)
    cv2.line(I4, (int(p[0][2]), int(p[1][2])), (int(p[0][7]),int(p[1][7])),(255,255,0),2)
    cv2.line(I4, (int(p[0][3]), int(p[1][3])), (int(p[0][8]),int(p[1][8])),(255,255,0),2)
    
    #top
    cv2.line(I4, (int(p[0][5]), int(p[1][5])), (int(p[0][6]),int(p[1][6])),(255,255,0),2)
    cv2.line(I4, (int(p[0][6]), int(p[1][6])), (int(p[0][7]),int(p[1][7])),(255,255,0),2)
    cv2.line(I4, (int(p[0][7]), int(p[1][7])), (int(p[0][8]),int(p[1][8])),(255,255,0),2)
    cv2.line(I4, (int(p[0][8]), int(p[1][8])), (int(p[0][9]),int(p[1][9])),(255,255,0),2)
    
    cv2.imshow('Dupa',I4)
    cv2.waitKey(10000)
    
    return