Beispiel #1
0
def morph_img(src_img, src_points, dst_img, dst_points, alpha=0.5):
    morph_points = []

    src_img = src_img.astype(np.float32)
    dst_img = dst_img.astype(np.float32)

    res_img = np.zeros(src_img.shape, src_img.dtype)

    for i in range(0, len(src_points)):
        x = (1 - alpha) * src_points[i][0] + alpha * dst_points[i][0]
        y = (1 - alpha) * src_points[i][1] + alpha * dst_points[i][1]
        morph_points.append((x, y))

    dt = core.measure_triangle(src_img, morph_points)

    for i in range(0, len(dt)):
        t1 = []
        t2 = []
        t = []

        for j in range(0, 3):
            t1.append(src_points[dt[i][j]])
            t2.append(dst_points[dt[i][j]])
            t.append(morph_points[dt[i][j]])

        core.morph_triangle(src_img, dst_img, res_img, t1, t2, t, alpha)

    return res_img
Beispiel #2
0
def tran_src(src_img, src_points, dst_points, face_area=None):
    # print(1111111)
    print(src_img.shape)
    jaw = core.JAW_END

    dst_list = dst_points \
               + core.matrix_rectangle(face_area[0], face_area[1], face_area[2], face_area[3]) \
               + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0])

    src_list = src_points \
               + core.matrix_rectangle(face_area[0], face_area[1], face_area[2], face_area[3]) \
               + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0])

    jaw_points = []

    for i in range(0, jaw):
        # print(i)
        jaw_points.append(dst_list[i])
        jaw_points.append(src_list[i])

    warp_jaw = cv2.convexHull(np.array(jaw_points), returnPoints=False)
    warp_jaw = warp_jaw.tolist()

    for i in range(0, len(warp_jaw)):
        warp_jaw[i] = warp_jaw[i][0]

    warp_jaw.sort()

    if len(warp_jaw) <= jaw:
        dst_list = dst_list[jaw - len(warp_jaw):]
        src_list = src_list[jaw - len(warp_jaw):]
        for i in range(0, len(warp_jaw)):
            dst_list[i] = jaw_points[int(warp_jaw[i])]
            src_list[i] = jaw_points[int(warp_jaw[i])]
    else:
        for i in range(0, jaw):
            if len(warp_jaw) > jaw and warp_jaw[i] == 2 * i and warp_jaw[
                    i + 1] == 2 * i + 1:
                warp_jaw.remove(2 * i)

            dst_list[i] = jaw_points[int(warp_jaw[i])]

    dt = core.measure_triangle(src_img, dst_list, src_points, dst_points)

    res_img = np.zeros(src_img.shape, dtype=src_img.dtype)

    for i in range(0, len(dt)):
        t_src = []
        t_dst = []

        for j in range(0, 3):
            t_src.append(src_list[dt[i][j]])
            t_dst.append(dst_list[dt[i][j]])
        if (checkLine(t_src) or checkLine(t_dst)):
            # print("not checked")
            continue
        else:
            core.affine_triangle(src_img, res_img, t_src, t_dst)

    return res_img
Beispiel #3
0
def morph_img(src_img, src_points, dst_img, dst_points, alpha=0.5):

    morph_points = []

    src_img = src_img.astype(np.float32)
    dst_img = dst_img.astype(np.float32)

    res_img = np.zeros(src_img.shape, src_img.dtype)
    # for i in src_points:
    #     print(i)

    # 这一步的目的是调整脸型,将原图关键点和目标图关键点之间取中间点,根据alpha值来取
    for i in range(0, len(src_points)):
        x = (1 - alpha) * src_points[i][0] + alpha * dst_points[i][0]
        y = (1 - alpha) * src_points[i][1] + alpha * dst_points[i][1]
        morph_points.append((x, y))

    dt = core.measure_triangle(src_img, morph_points, src_points, dst_points)

    for i in range(0, len(dt)):
        t1 = []
        t2 = []
        t = []
        for j in range(0, 3):
            t1.append(src_points[dt[i][j]])
            t2.append(dst_points[dt[i][j]])
            t.append(morph_points[dt[i][j]])
        if (checkLine(t) or checkLine(t1) or checkLine(t2)):
            continue
        core.morph_triangle(src_img, dst_img, res_img, t1, t2, t, alpha, i)

    return res_img
Beispiel #4
0
def tran_src(src_img, src_points, dst_points, face_area=None):
    jaw = core.JAW_END

    newface = get_auto_facearae(src_points, src_img)
    dst_list = dst_points \
               + core.matrix_rectangle(newface[0], newface[1], newface[2], newface[3]) \
               + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0])

    src_list = src_points \
               + core.matrix_rectangle(newface[0], newface[1], newface[2], newface[3]) \
               + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0])
    jaw_points = []

    for i in range(0, jaw):
        jaw_points.append(dst_list[i])
        jaw_points.append(src_list[i])

    warp_jaw = cv2.convexHull(np.array(jaw_points), returnPoints=False)
    warp_jaw = warp_jaw.tolist()

    for i in range(0, len(warp_jaw)):
        warp_jaw[i] = warp_jaw[i][0]

    warp_jaw.sort()

    if len(warp_jaw) <= jaw:
        dst_list = dst_list[jaw - len(warp_jaw):]
        src_list = src_list[jaw - len(warp_jaw):]
        for i in range(0, len(warp_jaw)):
            dst_list[i] = jaw_points[int(warp_jaw[i])]
            src_list[i] = jaw_points[int(warp_jaw[i])]
    else:
        for i in range(0, jaw):
            if len(warp_jaw) > jaw and warp_jaw[i] == 2 * i and warp_jaw[
                    i + 1] == 2 * i + 1:
                warp_jaw.remove(2 * i)

            dst_list[i] = jaw_points[int(warp_jaw[i])]

    dt = core.measure_triangle(src_img, dst_list)

    res_img = np.zeros(src_img.shape, dtype=src_img.dtype)

    for i in range(0, len(dt)):

        t_src = []
        t_dst = []

        for j in range(0, 3):
            t_src.append(src_list[dt[i][j]])
            t_dst.append(dst_list[dt[i][j]])

        core.affine_triangle(src_img, res_img, t_src, t_dst)

    return res_img
Beispiel #5
0
def tran_src(src_img, src_points, dst_points, face_area=None):
    # jaw = core.JAW_END

    dst_list = dst_points \
               + core.matrix_rectangle(face_area[0], face_area[1], face_area[2], face_area[3]) \
               + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0])

    src_list = src_points \
               + core.matrix_rectangle(face_area[0], face_area[1], face_area[2], face_area[3]) \
               + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0])

    # jaw_points = []

    # for i in range(0, jaw):
    #     jaw_points.append(dst_list[i])
    #     jaw_points.append(src_list[i])

    # warp_jaw = cv2.convexHull(np.array(jaw_points), returnPoints=False)
    # warp_jaw = warp_jaw.tolist()

    # for i in range(0, len(warp_jaw)):
    #     warp_jaw[i] = warp_jaw[i][0]

    # warp_jaw.sort()

    # if len(warp_jaw) <= jaw:
    #     dst_list = dst_list[jaw - len(warp_jaw):]
    #     src_list = src_list[jaw - len(warp_jaw):]
    #     for i in range(0, len(warp_jaw)):
    #         dst_list[i] = jaw_points[int(warp_jaw[i])]
    #         src_list[i] = jaw_points[int(warp_jaw[i])]
    # else:
    #     for i in range(0, jaw):
    #         if len(warp_jaw) > jaw and warp_jaw[i] == 2 * i and warp_jaw[i + 1] == 2 * i + 1:
    #             warp_jaw.remove(2 * i)

    #         dst_list[i] = jaw_points[int(warp_jaw[i])]

    dt = core.measure_triangle(src_img.shape, dst_list)

    res_img = np.zeros(src_img.shape, dtype=src_img.dtype)

    for i in range(0, len(dt)):
        t_src = []
        t_dst = []

        for j in range(0, 3):
            t_src.append(src_list[dt[i][j]])
            t_dst.append(dst_list[dt[i][j]])

        core.affine_triangle(src_img, res_img, t_src, t_dst)

    return res_img
Beispiel #6
0
def morph_img(src_img, src_points, dst_img, dst_points, alpha=0.5,show_bg=None):
    # test time 
    start = time.time()

    src_img = src_img.astype(np.float32)
    dst_img = dst_img.astype(np.float32)

    morph_points = []

    if show_bg:
        res_img = src_img.copy()
    else:
        res_img = np.zeros(src_img.shape, src_img.dtype)

    for i in range(0, len(src_points)):
        x = (1 - alpha) * src_points[i][0] + alpha * dst_points[i][0]
        y = (1 - alpha) * src_points[i][1] + alpha * dst_points[i][1]
        morph_points.append((x, y))
    

    # dt = core.measure_triangle(src_img, morph_points)
    dt = core.measure_triangle(src_img, src_points)

    for i in range(0, len(dt)):
        t1 = []
        t2 = []
        t = []

        for j in range(0, 3):
            t1.append(src_points[dt[i][j]])
            t2.append(dst_points[dt[i][j]])
            t.append(morph_points[dt[i][j]])

        core.morph_triangle(src_img, dst_img, res_img, t1, t2, t, alpha)
    stop = time.time()
    print("morph_img用时"+str(stop-start)+"秒")
    
    return res_img