如何将坐标映射到另一个图像(OpenCV)

2024-09-30 00:38:21 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,伙计们,我正在做一个简单的眼球跟踪项目,我计划通过以下方法来完成:

1.使用Dlib和opencv阈值查找两个瞳孔,这两个阈值工作正常,并提供瞳孔中心

  1. 我用眼睛的地标坐标画了一个矩形,画了一个围绕眼睛的矩形,这样瞳孔就在这个矩形内

  2. 我平均两个眼睛的矩形和瞳孔的坐标,得到鼻子或前额区域中心的矩形

Image here

现在我需要用瞳孔坐标(绿色的那个)将这个平均矩形映射到屏幕上,这样矩形的边界作为屏幕边界,瞳孔坐标模糊地表示我正在看的地方

你知道怎么提前谢谢你吗

下面是我如何尝试绘制地图的

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

Tags: rightcoordscv2leftframeintavgsm

热门问题