Here’s how the project turned out:
And the code for the project:
import cv2 import numpy as np import argparse import math from scipy.spatial import distance #ap = argparse.ArgumentParser() #ap.add_argument("-i", "--image", required = True, help = "Path to the image") #args = vars(ap.parse_args()) #img = cv2.imread(args["image"]) img = cv2.imread("test.jpg", 0) img = cv2.medianBlur(img,5) cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) cv2.namedWindow("Display", flags= cv2.WINDOW_AUTOSIZE) circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,100, param1=50,param2=25,minRadius=10,maxRadius=30) circles = np.uint16(np.around(circles)) #coordinates of pupils point1x = 0.0 point1y = 0.0 point2x = 0.0 point2y = 0.0 #coordinates of object on forehead leftpointx = 0 leftpointy = 0 rightpointx = 0 rightpointy = 0 #coordinates of pupils in case hough circles doesn't work leftpointx2 = 0 leftpointy2 = 0 rightpointx2 = 0 rightpointy2 = 0 objectexist = 0 m = 0 k = 0 dist = 0 #distance of pupils in pixels dist2 = 0 #distance of object in pixels mm = 100 #distance of object in mm n = 1 for i in circles[0,:]: # draw the outer circle cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2) # draw the center of the circle cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3) if n == 1: n = 2 point1x = float(i[0]) point1y = float(i[1]) elif n==2 : point2x = float(i[0]) point2y = float(i[1]) #print(" " + point1x + ", " + point1y + ", " + point2x + ", " + point2y) print(point1x) print(point1y) print(point2x) print(point2y) dist = math.hypot(point2x - point1x, point2y - point1y) #ipd in pixels #if dist < 10000: print(dist) def my_mouse_callback(event, x, y, flags, param): global m global k global leftpointx global leftpointy global rightpointx global rightpointy global leftpointx2 global leftpointy2 global rightpointx2 global rightpointy2 global objectexist global dist global dist2 if event==cv2.EVENT_LBUTTONDBLCLK: m = m+1 #print(x) if m == 1: leftpointx = x leftpointy = y elif m == 2: rightpointx = x rightpointy = y dist2 = math.hypot(rightpointx - leftpointx, rightpointy - leftpointy) print( "object distance = " + str(dist2)) if dist < 10000: distanceInMM = dist * (mm / dist2) # ipd in mm print( "IPD in mm = " + str(distanceInMM)) if dist > 10000: if event==cv2.EVENT_RBUTTONDBLCLK: #used if hough circles doesn't work k = k+1 if dist2 == 0: dist2 == 500 #print(x) if k == 1: leftpointx2 = x leftpointy2 = y elif k == 2: rightpointx2 = x rightpointy2 = y dist = math.hypot(rightpointx2 - leftpointx2, rightpointy2 - leftpointy2) print("IPD in pixels = " + str(dist)) distanceInMM = dist * (mm / dist2) # ipd in mm print( "IPD in mm = " + str(distanceInMM)) cv2.setMouseCallback("Display",my_mouse_callback,cimg) while(1): cv2.imshow("Display",cimg) if dist2 == 0 and dist < 10000: c = cv2.waitKey(0) if c == 32: #spacebar dist2 = 500 distanceInMM = dist * (mm / dist2) # ipd in mm print("IPD in mm = " + str(distanceInMM)) if cv2.waitKey(15)%0x100==27:break # waiting for clicking escape key cv2.destroyWindow("Display") #cv2.imshow('detected circles',cimg) #cv2.waitKey(0) #cv2.destroyAllWindows()