File size: 2,791 Bytes
6aab31e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import cv2
import numpy as np


def insert_person(left_image_path, right_image_path, person_image_path, depth="medium"):
    # Load left and right stereoscopic images
    left_image = cv2.imread(left_image_path)
    right_image = cv2.imread(right_image_path)

    # Load the segmented person image with alpha channel (transparency)
    person = cv2.imread(person_image_path, cv2.IMREAD_UNCHANGED)

    # Define scaling and disparity values for each depth level
    depth_settings = {
        "close": {
            "scale": 1.2,
            "disparity": 15,
        },  # Larger size and greater disparity for closer placement
        "medium": {
            "scale": 1.0,
            "disparity": 10,
        },  # Moderate size and disparity for medium placement
        "far": {
            "scale": 0.7,
            "disparity": 5,
        },  # Smaller size and lesser disparity for farther placement
    }

    # Retrieve scale and disparity based on depth level
    scale_factor = depth_settings[depth]["scale"]
    disparity = depth_settings[depth]["disparity"]

    # Resize the person image based on the scale factor
    person_h, person_w = person.shape[:2]
    new_size = (int(person_w * scale_factor), int(person_h * scale_factor))
    person_resized = cv2.resize(person, new_size, interpolation=cv2.INTER_AREA)

    # Determine the positions for placing the person in left and right images
    # (You may adjust these values to match specific surfaces or alignments in your background)
    left_x, left_y = (
        50,
        left_image.shape[0] - person_resized.shape[0] - 50,
    )  # Place near bottom for realism
    right_x = left_x + disparity  # Horizontal offset for depth effect

    # Overlay the person onto both left and right images with adjusted position
    for img, x in zip((left_image, right_image), (left_x, right_x)):
        # Ensure the person fits within the bounds of the image
        y, x = max(0, left_y), max(0, x)
        y_end = min(y + person_resized.shape[0], img.shape[0])
        x_end = min(x + person_resized.shape[1], img.shape[1])

        # Extract the region of interest (ROI)
        roi = img[y:y_end, x:x_end]

        # Apply alpha blending to combine person image with background
        person_alpha = (
            person_resized[: y_end - y, : x_end - x, 3] / 255.0
        )  # Alpha channel mask
        for c in range(3):
            roi[:, :, c] = (1 - person_alpha) * roi[
                :, :, c
            ] + person_alpha * person_resized[: y_end - y, : x_end - x, c]

        # Insert modified ROI back into the original image
        img[y:y_end, x:x_end] = roi

    # Return the modified left and right images
    return left_image, right_image