def getRightPhoneDetectArea(landmarks):
    h = ((landmarks[16][1] - landmarks[26][1])**2 + (landmarks[16][0] - landmarks[26][0])**2)**0.5
    w = h * ear_wh_scale

    x1 = float(landmarks[16][0])
    y1 = float(landmarks[16][1])
    x2 = float(landmarks[26][0])
    y2 = float(landmarks[26][1])

    x3 = float(landmarks[3][0])
    y3 = float(landmarks[3][1])



    if landmarks[16][0] == landmarks[26][0] :
        return [landmarks[3][0],landmarks[16][1],
                int(landmarks[3][0]-w),landmarks[16][1],
                int(landmarks[3][0]-w),landmarks[26][1],
                landmarks[3][0],landmarks[26][1]]
    else:

        k = (y2-y1)/(x2-x1)
        if k == 0:
            return [landmarks[3][0],landmarks[16][1],
                    int(landmarks[3][0]-w),landmarks[16][1],
                    int(landmarks[3][0]-w),landmarks[26][1],
                    landmarks[3][0],landmarks[26][1]]
        q = math.atan(abs(k))

        m = w/math.sin(q)

        #l1  k(x-x3)+y3 = y
        l1 = icarus_point.Line(icarus_point.Point(0,y3-k*x3),icarus_point.Point(-y3/k+x3,0))

        #l2 -(x-x1)/k + y1 = y
        l2 = icarus_point.Line(icarus_point.Point(0,y1+x1/k),icarus_point.Point(y1*k+x1,0))

        #l3 k(x-x3 - m)+y3 = y
        l3 = icarus_point.Line(icarus_point.Point(0,y3+k*(-m-x3)),icarus_point.Point(-y3/k+x3+m,0))

        #l4 -(x-x2)/k + y2 = y
        l4 = icarus_point.Line(icarus_point.Point(0,y2+x2/k),icarus_point.Point(y2*k+x2,0))

        k1 = icarus_point.GetCrossPoint(l1,l2)
        k2 = icarus_point.GetCrossPoint(l2,l3)
        k3 = icarus_point.GetCrossPoint(l3,l4)
        k4 = icarus_point.GetCrossPoint(l4,l1)

        return [int(k1.x),int(k1.y),int(k2.x),int(k2.y),int(k3.x),int(k3.y),int(k4.x),int(k4.y)]
def getLeftPhoneImage(image,landmarks):
    ph = ((landmarks[13][1] - landmarks[26][1])**2 + (landmarks[13][0] - landmarks[26][0])**2)**0.5
    pw = ph * ear_wh_scale


    x1 = float(landmarks[13][0])
    y1 = float(landmarks[13][1])
    x2 = float(landmarks[26][0])
    y2 = float(landmarks[26][1])

    if landmarks[13][0] == landmarks[26][0]:
        return image[landmarks[13][1]:landmarks[26][1],int(landmarks[1][0]-pw):landmarks[1][0]]
    else:
        k = (y2-y1)/(x2-x1)
        q = math.atan(k)
        if k == 0:
            return image[landmarks[13][1]:landmarks[26][1],int(landmarks[1][0]-pw):landmarks[1][0]]
        x3 = float(landmarks[1][0])
        y3 = float(landmarks[1][1])

        #l1  k(x-x3)+y3 = y
        l1 = icarus_point.Line(icarus_point.Point(0,y3-k*x3),icarus_point.Point(-y3/k+x3,0))

        #l2 -(x-x1)/k + y1 = y
        l2 = icarus_point.Line(icarus_point.Point(0,y1+x1/k),icarus_point.Point(y1*k+x1,0))

        k1 = icarus_point.GetCrossPoint(l1,l2)

        (h, w) = image.shape[:2]
        if k>0:
            M = cv2.getRotationMatrix2D((int(k1.x),int(k1.y)), -90+q*180/math.pi, 1.0)
        else:
            M = cv2.getRotationMatrix2D((int(k1.x),int(k1.y)), 90+q*180/math.pi, 1.0)
        rotated = cv2.warpAffine(image, M, (w, h))
        return rotated[int(k1.y):int(k1.y+ph),int(k1.x-pw):int(k1.x)]
def getSmokeDetectArea(landmarks):
    w = abs(landmarks[8][0] -landmarks[9][0])
    w *= mounth_scale
    cx = landmarks[8][0]/2 +landmarks[9][0]/2
    cy = landmarks[8][1]/2 +landmarks[9][1]/2

    x1 = float(landmarks[8][0])
    y1 = float(landmarks[8][1])
    x2 = float(landmarks[9][0])
    y2 = float(landmarks[9][1])

    if w == 0:
        w = abs(landmarks[8][1] -landmarks[9][1])*mounth_scale
        return [int(cx-w/2),int(cy-w/2),
                int(cx-w/2),int(cy+w/2),
                int(cx+w/2),int(cy+w/2),
                int(cx+w/2),int(cy-w/2)]
    elif landmarks[8][1] -landmarks[9][1] == 0:
        return [int(cx-w/2),int(cy-w/2),
                int(cx-w/2),int(cy+w/2),
                int(cx+w/2),int(cy+w/2),
                int(cx+w/2),int(cy-w/2)]


    q = math.atan(abs((y2-y1)/(x2-x1)))
    r = w/2
    m = r/math.sin(q)
    n = r/math.cos(q)

    #l1  (y2-y1)(x-x1+m)/(x2-x1)+y1 = y
    l1 = icarus_point.Line(icarus_point.Point(0,(y2-y1)*(-x1+m)/(x2-x1)+y1),icarus_point.Point(-y1*(x2-x1)/(y2-y1)+x1-m,0))

    # l2 -(x2-x1)(x-(x1+x2)/2+n)/(y2-y1)+(y1+y2)/2 = y
    l2 = icarus_point.Line(icarus_point.Point(0,-(x2-x1)*(n-(x1+x2)/2)/(y2-y1)+(y1+y2)/2),icarus_point.Point((y1+y2)*(y2-y1)/(x2-x1)/2+(x1+x2)/2-n,0))

    # l3 (y2-y1)(x-x1-m)/(x2-x1)+y1 = y
    l3 = icarus_point.Line(icarus_point.Point(0,(y2-y1)*(-x1-m)/(x2-x1)+y1),icarus_point.Point(-y1*(x2-x1)/(y2-y1)+x1+m,0))

    # l4 -(x2-x1)(x-(x1+x2)/2-n)/(y2-y1)+(y1+y2)/2 = y
    l4 = icarus_point.Line(icarus_point.Point(0,-(x2-x1)*(-(x1+x2)/2-n)/(y2-y1)+(y1+y2)/2),icarus_point.Point((y1+y2)*(y2-y1)/(x2-x1)/2+(x1+x2)/2+n,0))

    k1 = icarus_point.GetCrossPoint(l1,l2)
    k2 = icarus_point.GetCrossPoint(l2,l3)
    k3 = icarus_point.GetCrossPoint(l3,l4)
    k4 = icarus_point.GetCrossPoint(l4,l1)

    return [int(k1.x),int(k1.y),int(k2.x),int(k2.y),int(k3.x),int(k3.y),int(k4.x),int(k4.y)]
def getEyesArea(landmarks):
    #眼睛范围取两眼正中心之间的距离 的 5/3 和10/9
    x1 = (landmarks[0][0] +landmarks[1][0])/2.0
    y1 = (landmarks[0][1] +landmarks[1][1])/2.0
    x2 = (landmarks[2][0] +landmarks[3][0])/2.0
    y2 = (landmarks[2][1] +landmarks[3][1])/2.0

    cx = (x1+x2)/2
    cy = (y1+y2)/2

    d = ((x1-x2)**2+(y1-y2)**2)**0.5
    w = d*5/3.0
    h = d*10/9.0

    if y1 == y2:
        l = (x1+x2)/2 - w/2
        t = y1-h/2
        return [int(l),int(t),int(l+w),int(t),int(l+w),int(t+h),int(l),int(t+h)]
    elif x1 == x2:
        t = (y1+y2)/2 - w/2
        l = x1-h/2
        return [int(l+w),int(t),int(l+w),int(t+h),int(l),int(t+h),int(l),int(t)]
    else:
        k = (y1-y2)/(x1-x2)

        q = math.atan(abs((y2-y1)/(x2-x1)))
        m = h/2/math.sin(q)
        n = w/2/math.cos(q)

        if k >0:


            #l1  k(x-cx+m)+cy = y
            l1 = icarus_point.Line(icarus_point.Point(0,k*(-cx+m)+cy),icarus_point.Point(-cy/k+cx-m,0))

            #l2  -(x-cx-n)/k+cy = y
            l2 = icarus_point.Line(icarus_point.Point(0,-(-cx-n)/k+cy),icarus_point.Point(cy*k+cx+n,0))

            #l3  k(x-cx-m)+cy = y
            l3 = icarus_point.Line(icarus_point.Point(0,k*(-cx-m)+cy),icarus_point.Point(-cy/k+cx+m,0))

            #l4  -(x-cx+n)/k+cy = y
            l4 = icarus_point.Line(icarus_point.Point(0,-(-cx+n)/k+cy),icarus_point.Point(cy*k+cx-n,0))

            k1 = icarus_point.GetCrossPoint(l1,l2)
            k2 = icarus_point.GetCrossPoint(l2,l3)
            k3 = icarus_point.GetCrossPoint(l3,l4)
            k4 = icarus_point.GetCrossPoint(l4,l1)

            return [int(k1.x),int(k1.y),int(k2.x),int(k2.y),int(k3.x),int(k3.y),int(k4.x),int(k4.y)]
        else:
            #l1  k(x-cx+h/2)+cy = y
            l3 = icarus_point.Line(icarus_point.Point(0,k*(-cx+m)+cy),icarus_point.Point(-cy/k+cx-m,0))

            #l2  -(x-cx-w/2)/k+cy = y
            l4 = icarus_point.Line(icarus_point.Point(0,-(-cx-n)/k+cy),icarus_point.Point(cy*k+cx+n,0))

            #l3  k(x-cx-h/2)+cy = y
            l1 = icarus_point.Line(icarus_point.Point(0,k*(-cx-m)+cy),icarus_point.Point(-cy/k+cx+m,0))

            #l4  -(x-cx+w/2)/k+cy = y
            l2 = icarus_point.Line(icarus_point.Point(0,-(-cx+n)/k+cy),icarus_point.Point(cy*k+cx-n,0))

            k1 = icarus_point.GetCrossPoint(l1,l2)
            k2 = icarus_point.GetCrossPoint(l2,l3)
            k3 = icarus_point.GetCrossPoint(l3,l4)
            k4 = icarus_point.GetCrossPoint(l4,l1)

            return [int(k1.x),int(k1.y),int(k2.x),int(k2.y),int(k3.x),int(k3.y),int(k4.x),int(k4.y)]