# -*- coding: utf-8 -*- """ Created on Thu Mar 29 12:16:17 2018 @author: Armando FEMAT for the LMFA (Ecole Centrale de Lyon) The purpose of this code is to make the spatial calibration for DaVis images. It consist in taking a doble-image, separate them in two and superimpose them. It also calculates the magnification in the picture [pixels]<->[mm] """ "Always code as if the person who will maintain your code is a maniac serial killer knows where you live" import cv2 import numpy as np import ReadIM from skimage import exposure """ Variables you can change in fonction of the experiment you are doing (f.e. the image to do the calibration in) """ vbuff, vatts = ReadIM.extra.get_Buffer_andAttributeList('Mire_Jour.im7') v_array, vbuff = ReadIM.extra.buffer_as_array(vbuff) #Import the double-image #src_img = cv2.imread('double_image2.jpg') #src_img_grey = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY) #cv2.imshow('Grey Image',src_img_grey) #Test to see if the image you are using is the right one """ Variables initiation (don't touch unless you know what you are doing) """ data = {} #data['img'] = src_img_grey.copy() img_rescaled = exposure.rescale_intensity(v_array) data['img'] = img_rescaled[0] data['points'] = [] i = 0 upper_corner = [] lower_corner = [] """ Defined functions to use inside the program 1.- pick_corner (takes in the clicks done by the mouse and save pixel location to a list) 2.- draw_rectangle () """ def pick_corner(action, x, y, flags, userdata): # Referencing global variables global corner,i,j # Action to be taken when left mouse button is pressed if action==cv2.EVENT_LBUTTONDOWN: cv2.circle(data['img'], (x,y),1, (255,255,255), 3, 16) data['points'].append([x,y]) i += 1 def draw_rectangle(action, x, y, flags, userdata): # Referencing global variables global upper_corner, lower_corner # Action to be taken when left mouse button is pressed if action==cv2.EVENT_LBUTTONDOWN: upper_corner=[(x,y)] # Mark the center cv2.circle(data['img'], upper_corner[0], 1, (255,255,0), 2, cv2.LINE_AA ) # Action to be taken when left mouse button is released elif action==cv2.EVENT_LBUTTONUP: lower_corner=[(x,y)] cv2.circle(data['img'], lower_corner[0], 1, (255,255,0), 2, cv2.LINE_AA ) cv2.rectangle(data['img'], upper_corner[0], lower_corner[0], (0, 255, 0), thickness=2, lineType=cv2.LINE_8) cv2.imshow("Window",data['img']) #Make two images out of the double-image #Obtain the image zone 1 data['image_left'] = data['img'].copy() cv2.namedWindow("Window",cv2.WINDOW_NORMAL) #Create the window to show image cv2.setMouseCallback("Window", draw_rectangle) k = 0 while k!=27: cv2.imshow("Window", data['image_left']) k = cv2.waitKey(20) & 0xFF #if k==99: # data['img'] = src_img_grey.copy() cv2.destroyAllWindows() data['image_left'] = data['image_left'][upper_corner[0][1]:lower_corner[0][1],upper_corner[0][0]:lower_corner[0][0]] #cv2.namedWindow("Left Image",cv2.WINDOW_AUTOSIZE) #cv2.imshow("Left Image", data['image_left']) cv2.waitKey(0) cv2.destroyAllWindows() #Obtain the calibration zone 1 data['image_right'] = data['img'].copy() cv2.namedWindow("Window",cv2.WINDOW_NORMAL) #Create the window to show image cv2.setMouseCallback("Window", draw_rectangle) k = 0 while k!=27: cv2.imshow("Window", data['image_right']) k = cv2.waitKey(20) & 0xFF #if k==99: # data['img'] = src_img_grey.copy() cv2.destroyAllWindows() data['image_right'] = data['image_right'][upper_corner[0][1]:lower_corner[0][1],upper_corner[0][0]:lower_corner[0][0]] #cv2.namedWindow("Right Image",cv2.WINDOW_AUTOSIZE) #cv2.imshow("Right Image", data['image_right']) cv2.waitKey(0) cv2.destroyAllWindows() #Obtain the calibration zone 1 cv2.namedWindow("Window",cv2.WINDOW_NORMAL) #Create the window to show image cv2.setMouseCallback("Window", pick_corner) k = 0 while k!=27: cv2.imshow("Window", data['image_left']) k = cv2.waitKey(20) & 0xFF if i>3: break #if k==99: # data['img'] = src_img_grey.copy() cv2.destroyAllWindows() pts_dst = np.asarray(data['points']) data['points'] = [] #Obtain the calibration zone 2 cv2.namedWindow("Window",cv2.WINDOW_NORMAL) #Create the window to show image cv2.setMouseCallback("Window", pick_corner) k = 0 i = 0 while k!=27: cv2.imshow("Window", data['image_right']) k = cv2.waitKey(20) & 0xFF if i>3: break #if k==99: # data['img'] = src_img_grey.copy() cv2.destroyAllWindows() pts_src = np.asarray(data['points']) #Obtain the homography transformation out of the calibration zone h, status = cv2.findHomography(pts_src,pts_dst) #Define the limits of the right and left images #Apply the homography transformation data['img_temp'] = cv2.warpPerspective(data['image_right'], h, (data['image_left'].shape[1],data['image_left'].shape[0])) #Combine the images into one and show them to see if it worked data['img_temp'] = cv2.cvtColor(data['img_temp'], cv2.COLOR_GRAY2BGR) data['image_left'] = cv2.cvtColor(data['image_left'], cv2.COLOR_GRAY2BGR) data['image_left'][0:len(data['image_left']),0:len(data['image_left'][0]),2] = 35535 data['img_temp'][0:len(data['image_left']),0:len(data['image_left'][0]),0] = 65535 data['img_final'] = data['image_left'] + data['img_temp'] data['img_final'] = exposure.rescale_intensity(data['img_final']) cv2.namedWindow("Final Source Image",cv2.WINDOW_NORMAL) cv2.namedWindow("Normal Source Image",cv2.WINDOW_NORMAL) cv2.namedWindow("Warped Source Image",cv2.WINDOW_NORMAL) cv2.imshow("Normal Source Image", data['image_left']) cv2.imshow("Warped Source Image", data['img_temp']) cv2.imshow("Final Source Image", data['img_final']) #cv2.imwrite("imagenial.jpg", im_out) """ Needs yet to be adapted to our case history #Writing files atts = ReadIM.load_AttributeList({'attribute':'value'}) ReadIM.WriteIM7('saved_file.im7', True, vbuff, atts.next) del(vbuff) ReadIM.DestroyBuffer(buff) ReadIM.DestroyAttributeListSafe(atts) """ #End code and close everything cv2.waitKey(0) cv2.destroyAllWindows()