diff --git a/EyeTrackApp/blink.py b/EyeTrackApp/blink.py new file mode 100644 index 0000000..5bd91d7 --- /dev/null +++ b/EyeTrackApp/blink.py @@ -0,0 +1,20 @@ +import numpy as np + +def BLINK(self): + + intensity = np.sum(self.current_image_gray_clean) + self.frames = self.frames + 1 + + if intensity > self.max_int: + self.max_int = intensity + if self.frames > 200: + self.max_ints.append(self.max_int) + if intensity < self.min_int: + self.min_int = intensity + + if len(self.max_ints) > 1: + if intensity > min(self.max_ints): + self.blinkvalue = True + else: + self.blinkvalue = False + # print(self.blinkvalue, self.max_int, self.min_int, self.frames, intensity) \ No newline at end of file diff --git a/EyeTrackApp/eye_processor.py b/EyeTrackApp/eye_processor.py index e314a1e..3706fdb 100644 --- a/EyeTrackApp/eye_processor.py +++ b/EyeTrackApp/eye_processor.py @@ -55,6 +55,7 @@ from haar_surround_feature import * from blob import * from ransac import * from hsrac import * +from blink import * class InformationOrigin(Enum): RANSAC = 1 @@ -397,40 +398,6 @@ class EyeProcessor: - - - - - - - - - - - - - - def BLINK(self): - - intensity = np.sum(self.current_image_gray) - self.frames = self.frames + 1 - - if intensity > self.max_int: - self.max_int = intensity - if self.frames > 200: - self.max_ints.append(self.max_int) - if intensity < self.min_int: - self.min_int = intensity - - if len(self.max_ints) > 1: - if intensity > min(self.max_ints): - print("Blink") - self.blinkvalue = True - else: - self.blinkvalue = False - print(self.blinkvalue) - - def ALGOSELECT(self): if self.failed == 0 and self.firstalgo != None: @@ -569,11 +536,16 @@ class EyeProcessor: self.current_image_gray_clean = self.current_image_gray.copy() #copy this frame to have a clean image for blink algo # print(self.settings.gui_RANSAC3D) + BLINK(self) + cx, cy, thresh = HSRAC(self) out_x, out_y = cal_osc(self, cx, cy) - self.output_images_and_update(thresh, EyeInformation(InformationOrigin.HSRAC, out_x, out_y, 0, False)) #update app + if cx == 0: + self.output_images_and_update(thresh, EyeInformation(InformationOrigin.HSRAC, out_x, out_y, 0, True)) #update app + else: + self.output_images_and_update(thresh, EyeInformation(InformationOrigin.HSRAC, out_x, out_y, 0, self.blinkvalue)) + - # cx, cy, thresh = RANSAC3D(self) # out_x, out_y = cal_osc(self, cx, cy) # self.output_images_and_update(thresh, EyeInformation(InformationOrigin.RANSAC, out_x, out_y, 0, False)) #update app diff --git a/EyeTrackApp/hsrac.py b/EyeTrackApp/hsrac.py index f20fe9a..6c42085 100644 --- a/EyeTrackApp/hsrac.py +++ b/EyeTrackApp/hsrac.py @@ -13,7 +13,8 @@ import math lru_maxsize_vvs = 16 lru_maxsize_vs = 64 # CV param -default_radius = 20 + +default_radius = 15 auto_radius_range = (default_radius - 10, default_radius + 10) # (10,30) blink_init_frames = 60 * 3 # 60fps*3sec,Number of blink statistical frames # step==(x,y) @@ -523,6 +524,8 @@ def fit_rotated_ellipse(data, P): def HSRAC(self): + default_radius = self.settings.gui_HSF_radius + auto_radius_range = (default_radius - 10, default_radius + 10) # (10,30) frame = self.current_image_gray if self.now_mode == self.cv_mode[1]: @@ -530,27 +533,27 @@ def HSRAC(self): prev_res_len = len(self.response_list) # adjustment of radius if prev_res_len == 1: - # len==1==self.response_list==[self.default_radius] + # len==1==self.response_list==[default_radius] self.cvparam.radius = self.auto_radius_range[0] elif prev_res_len == 2: - # len==2==self.response_list==[self.default_radius, self.auto_radius_range[0]] + # len==2==self.response_list==[default_radius, self.auto_radius_range[0]] self.cvparam.radius = self.auto_radius_range[1] elif prev_res_len == 3: - # len==3==self.response_list==[self.default_radius,self.auto_radius_range[0],self.auto_radius_range[1]] + # len==3==self.response_list==[default_radius,self.auto_radius_range[0],self.auto_radius_range[1]] sort_res = sorted(self.response_list, key=lambda x: x[1])[0] # Extract the radius with the lowest response value - if sort_res[0] == self.default_radius: + if sort_res[0] == default_radius: # If the default value is best, change self.now_mode to init after setting radius to the default value. - self.cvparam.radius = self.default_radius + self.cvparam.radius = default_radius self.now_mode = self.cv_mode[2] if not self.skip_blink_detect else self.cv_mode[3] self.response_list = [] elif sort_res[0] == self.auto_radius_range[0]: - self.radius_cand_list = [i for i in range(self.auto_radius_range[0], self.default_radius, self.default_step[0])][1:] + self.radius_cand_list = [i for i in range(self.auto_radius_range[0], default_radius, self.default_step[0])][1:] # self.default_step is defined separately for xy, but radius is shared by xy, so it may be buggy # It should be no problem to set it to anything other than self.default_step self.cvparam.radius = self.radius_cand_list.pop() else: - self.radius_cand_list = [i for i in range(self.default_radius, self.auto_radius_range[1], self.default_step[0])][1:] + self.radius_cand_list = [i for i in range(default_radius, self.auto_radius_range[1], self.default_step[0])][1:] # self.default_step is defined separately for xy, but radius is shared by xy, so it may be buggy # It should be no problem to set it to anything other than self.default_step self.cvparam.radius = self.radius_cand_list.pop() @@ -721,7 +724,9 @@ def HSRAC(self): cv2.circle(self.current_image_gray, min_loc, 2, (0, 0, 255), -1) # the point of the darkest area in the image try: + print(radius) return out_x, out_y, thresh + except: return 0, 0, thresh