嘿,伙计们,我正在做一个简单的眼球跟踪项目,我计划通过以下方法来完成:
1.使用Dlib和opencv阈值查找两个瞳孔,这两个阈值工作正常,并提供瞳孔中心
我用眼睛的地标坐标画了一个矩形,画了一个围绕眼睛的矩形,这样瞳孔就在这个矩形内
我平均两个眼睛的矩形和瞳孔的坐标,得到鼻子或前额区域中心的矩形
现在我需要用瞳孔坐标(绿色的那个)将这个平均矩形映射到屏幕上,这样矩形的边界作为屏幕边界,瞳孔坐标模糊地表示我正在看的地方
你知道怎么提前谢谢你吗
下面是我如何尝试绘制地图的
import cv2
将numpy作为np导入 从凝视跟踪导入凝视跟踪 从scipy.spatial导入距离作为距离
凝视=凝视跟踪() 网络摄像头=cv2.视频捕获(2)
def映射到较小的映射框(sm_bbox_w,sm_bbox_h,lg_win_w,lg_win_h,avg_p_x,avg_p_y):
sm_height_delta = lg_win_h/sm_bbox_h
sm_width_delta = lg_win_w/sm_bbox_w
sm_scaled_x = round(avg_p_x/sm_width_delta)
sm_scaled_y = round(avg_p_y/sm_height_delta)
return [sm_scaled_x, sm_scaled_y]
def映射到更大的容器(sm容器w、sm容器h、win容器w、win容器h、sc容器x、sc容器y):
sc_height_delta = sm_bbox_h/win_h
sc_width_delta = sm_bbox_w/win_w
sc_win_x = round(sc_x/sc_width_delta)
sc_win_y = round(sc_y/sc_height_delta)
return [sc_win_x, sc_win_y]
def cam_frame_尺寸(frame_cam):
cam_w, cam_h = gaze.get_frame_size()
return [cam_w, cam_h]
def屏幕\帧\尺寸(帧\屏幕):
screen_w, screen_h = frame_screen.shape[:2]
return [screen_w, screen_h]
def get_gaze_坐标(凸轮框架):
left_pupil = gaze.pupil_left_coords()
right_pupil = gaze.pupil_right_coords()
coord_coll = gaze.eye_roi_bb()
if len(coord_coll) == 2:
left_coords = coord_coll[0]
right_coords = coord_coll[1]
left_x1 = left_coords[0]
left_x2 = left_coords[1]
left_y1 = left_coords[2]
left_y2 = left_coords[3]
right_x1 = right_coords[0]
right_x2 = right_coords[1]
right_y1 = right_coords[2]
right_y2 = right_coords[3]
avg_x1 = int((left_x1 + right_x1)/2)
avg_x2 = int((left_x2 + right_x2)/2)
avg_y1 = int((left_y1 + right_y1)/2 - 5)
avg_y2 = int((left_y2 + right_y2)/2 + 5)
avg_bbox_w = int(dist.euclidean((avg_x1,avg_y1), (avg_x2, avg_y1)))
avg_bbox_h = int(dist.euclidean((avg_x1,avg_y1), (avg_x1, avg_y2)))
# avg_bbox_w_c = int((avg_x1+avg_x2)/2, (avg_y1+avg_y2)/2)
# avg_bbox_h_c = int((avg))
cam_size = cam_frame_size(cam_frame)
cam_height_delta = cam_size[1]/avg_bbox_h
cam_width_delta = cam_size[0]/avg_bbox_w
screen_size = screen_frame_size(screen_frame)
if left_pupil or right_pupil is not None:
avg_pupil_x = int((right_pupil[0] + left_pupil[0])/2)
avg_pupil_y = int((right_pupil[1] + left_pupil[1])/2)
cv2.rectangle(cam_frame, (avg_x1,avg_y1), (avg_x2,avg_y2), (0, 255, 0), 1)
cv2.rectangle(cam_frame, (right_x1,right_y1-5), (right_x2,right_y2+5), (0, 0, 255), 1)
cv2.rectangle(cam_frame, (left_x1,left_y1-5), (left_x2,left_y2+5), (0, 0, 255), 1)
# sm_sc_coords = map_to_smaller_bbox(avg_bbox_w, avg_bbox_h,
# cam_size[0], cam_size[1], avg_pupil_x,avg_pupil_y)
# lg_sc_coords = map_to_larger_bbox(avg_bbox_w, avg_bbox_h,
# screen_size[0], screen_size[1], sm_sc_coords[0], sm_sc_coords[1])
return (avg_pupil_x, avg_pupil_y)
尽管如此: #我们从网络摄像头得到了一个新的画面 ret,cam_frame=webcam.read()
if not ret:
print("Couldn't get Video Source")
break
# We send this frame to GazeTracking to analyze it
gaze.refresh(cam_frame)
cam_frame = gaze.annotated_frame()
screen_frame = np.zeros((1366, 768, 3), np.uint8)
# text = ""
# if gaze.is_blinking():
# text = "Blinking"
# elif gaze.is_right():
# text = "Looking right"
# elif gaze.is_left():
# text = "Looking left"
# elif gaze.is_center():
# text = "Looking center"
# cv2.putText(frame, text, (90, 60), cv2.FONT_HERSHEY_DUPLEX, 0.5, (147, 58, 31), 1)
# left_pupil = gaze.pupil_left_coords()
# right_pupil = gaze.pupil_right_coords()
# if (left_pupil or right_pupil) != None :
# avg_center_coords = (int((left_pupil[0] + right_pupil[0])/2), int((left_pupil[1] + right_pupil[1])/2))
# cv2.putText(frame, "Avg: " + str(avg_center_coords), (90, 200), cv2.FONT_HERSHEY_DUPLEX, 0.5, (147, 58, 31), 1)
# cv2.putText(frame, "Left pupil: " + str(left_pupil), (90, 130), cv2.FONT_HERSHEY_DUPLEX, 0.5, (147, 58, 31), 1)
# cv2.putText(frame, "Right pupil: " + str(right_pupil), (90, 165), cv2.FONT_HERSHEY_DUPLEX, 0.5, (147, 58, 31), 1)
# coord_coll = gaze.eye_roi_bb()
# if len(coord_coll) == 2:
# left_coords = coord_coll[0]
# right_coords = coord_coll[1]
# left_x1 = left_coords[0]
# left_x2 = left_coords[1]
# left_y1 = left_coords[2]
# left_y2 = left_coords[3]
# right_x1 = right_coords[0]
# right_x2 = right_coords[1]
# right_y1 = right_coords[2]
# right_y2 = right_coords[3]
# avg_x1 = int((left_x1 + right_x1)/2)
# avg_x2 = int((left_x2 + right_x2)/2)
# avg_y1 = int((left_y1 + right_y1)/2 - 5)
# avg_y2 = int((left_y2 + right_y2)/2 + 5)
# cv2.rectangle(frame, (avg_x1,avg_y1), (avg_x2,avg_y2), (0, 255, 0), 1)
# cv2.rectangle(frame, (right_x1,right_y1-5), (right_x2,right_y2+5), (0, 0, 255), 1)
# left_bbox_width = int((left_x2 - left_x1) + 1)
# left_bbox_height = int((left_y2 - left_y1) + 1)
# right_bbox_width = int((right_x2 - right_x1) + 1)
# right_bbox_height = int((right_y2 - right_y1) + 1)
# print((left_bbox_width, left_bbox_height), (right_bbox_width, right_bbox_height))
# left_bbox_w = int(dist.euclidean((left_x1,left_y1),(left_x2,left_y2)))
# left_bbox_h = int(dist.euclidean((left_x1,left_y2),(left_x1,left_y1)))
# right_bbox_w = int(dist.euclidean((right_x1,right_y1),(right_x2,right_y2)))
# right_bbox_w = int(dist.euclidean((right_x1,right_y2),(right_x1,right_y1)))
# avg_bbox_w = int(dist.euclidean((avg_x1,avg_y1), (avg_x2, avg_y1)))
# avg_bbox_h = int(dist.euclidean((avg_x1,avg_y1), (avg_x1, avg_y2)))
# print(avg_bbox_w, avg_bbox_h)
# width, height = gaze.get_frame_size()
# width, height = width, height
# height_delta = height/avg_bbox_h
# width_delta = width/avg_bbox_w
# if right_pupil is not None:
# scaled_x1 = round(right_pupil[0]*height_delta)
# print(width_delta, height_delta)
# cv2.rectangle(frame, (scaled_x1, scaled_x2), (scaled_y1, scaled_y2), (0,0,255), 1)
# print(scaled_x1, scaled_x2, scaled_y1, scaled_y2)
# if left_pupil or right_pupil is not None:
# avg_pupil_x = int((right_pupil[0] + left_pupil[0])/2)
# avg_pupil_y = int((right_pupil[1] + left_pupil[1])/2)
# sm_sc_coords = map_to_smaller_bbox(avg_bbox_w, avg_bbox_h,
# width, height, avg_pupil_x,avg_pupil_y)
# # print(sm_sc_coords[0], sm_sc_coords[1])
# # cv2.rectangle(frame, (sm_sc_coords[2], sm_sc_coords[4]), (sm_sc_coords[3], sm_sc_coords[5]), (0,0,255), 1)
# lg_sc_coords = map_to_larger_bbox(avg_bbox_w, avg_bbox_h,
# width, height, sm_sc_coords[0], sm_sc_coords[1])
# cv2.rectangle(frame, (lg_sc_coords[2], lg_sc_coords[4]), (lg_sc_coords[3], lg_sc_coords[5]), (0,0,255), 1)
# print(lg_sc_coords[0], lg_sc_coords[1])
# scaled_x = round(avg_pupil_x*width_delta)
# scaled_y = round(avg_pupil_y*height_delta)
# print(avg_pupil_x, avg_pupil_y, scaled_x, scaled_y)
p_xy = get_gaze_coords(cam_frame)
print(p_xy)
# if p_xy is not None:
# # print(p_xy)
# screen_frame = cv2.circle(screen_frame, (p_xy[0], p_xy[1]), 10, (0, 255, 0), 1)
# cv2.line(frame, (left_pupil[0], left_pupil[1]), (lg_sc_coords[0], lg_sc_coords[1]), (0,0,255), 1)
# cv2.line(frame, (right_pupil[0], right_pupil[1]), (lg_sc_coords[0], lg_sc_coords[1]), (0,0,255), 1)
# print(lg_sc_coords[2], lg_sc_coords[4], lg_sc_coords[3], lg_sc_coords[5])
# cv2.namedWindow('Demo',cv2.WINDOW_NORMAL)
# cv2.namedWindow('gaze',cv2.WINDOW_NORMAL)
cv2.imshow("Demo", cam_frame)
# cv2.imshow("gaze", screen_frame)
if cv2.waitKey(1) == 27:
break
目前没有回答
相关问题 更多 >
编程相关推荐