Skip to content

Line

This

Line(buffer_len=10)

Class to model a lane-line.

Source code in src/pipeline/line.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def __init__(self, buffer_len: int = 10):
    # Flag to mark if the line was detected the last iteration
    self.detected = False
    # Number of consecutive errors (MSE > threshold)
    self.error_count = 0

    # Polynomial coefficients fitted on the last iteration
    self.last_fit_pixel = None
    # List of polynomial coefficients of the last N iterations
    self.recent_fits_pixel = deque(maxlen=buffer_len)  # type: ignore

    # Store all pixels coordinates (x, y) of line detected
    self.all_x = None
    self.all_y = None

draw(mask, color=(255, 0, 0), line_width=10, average=False)

Draws a line onto the warped image

Parameters:

Name Type Description Default
mask cv.Mat

The warped blank image onto which the lane is to be drawn

required
color tuple[int, int, int], optional

Color of the lanes which are to be drawn, by default (255, 0, 0)

(255, 0, 0)
line_width int, optional

Width of the line that is to be drawn, by default 10

10
average bool, optional

If True, the average fit is used for drawing the lane boundaries, by default False

False

Returns:

Type Description
cv.Mat

Returns the lane drawn onto the warped blank image

Source code in src/pipeline/line.py
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
def draw(
    self, mask: cv.Mat, color: tuple[int, int, int] = (255, 0, 0), line_width: int = 10, average: bool = False
) -> cv.Mat:
    """Draws a line onto the warped image

    Parameters
    ----------
    mask : cv.Mat
        The warped blank image onto which the lane is to be drawn
    color : tuple[int, int, int], optional
        Color of the lanes which are to be drawn, by default (255, 0, 0)
    line_width : int, optional
        Width of the line that is to be drawn, by default 10
    average : bool, optional
        If True, the average fit is used for drawing the lane boundaries, by default False

    Returns
    -------
    cv.Mat
        Returns the lane drawn onto the warped blank image
    """
    h, _, _ = mask.shape

    plot_y = np.linspace(0, h - 1, h)
    coeffs = self.average_fit if average else self.last_fit_pixel

    if coeffs is None:
        logger.error("Something went wrong, no coefficients found for line.")
        sys.exit(1)

    line_center = coeffs[0] * plot_y**2 + coeffs[1] * plot_y + coeffs[2]
    line_left_side = line_center - line_width // 2
    line_right_side = line_center + line_width // 2

    # Some magic here to recast the x and y points into usable format for cv.fillPoly()
    pts_left = np.array(list(zip(line_left_side, plot_y)))
    pts_right = np.array(np.flipud(list(zip(line_right_side, plot_y))))
    pts = np.vstack([pts_left, pts_right])

    # Draw the lane onto the warped blank image
    return cv.fillPoly(mask, [np.int32(pts)], color)

update_line(new_fit_pixel, detected)

Update the given line object with new polynomial coefficients.

Parameters:

Name Type Description Default
new_fit_pixel Any

The new polynomial coefficients.

required
detected bool

Flag to mark if the line was detected the last iteration.

required
Source code in src/pipeline/line.py
30
31
32
33
34
35
36
37
38
39
40
41
42
43
def update_line(self, new_fit_pixel: Any, detected: bool) -> None:
    """Update the given line object with new polynomial coefficients.

    Parameters
    ----------
    new_fit_pixel : Any
        The new polynomial coefficients.
    detected : bool
        Flag to mark if the line was detected the last iteration.
    """
    self.detected = detected

    self.last_fit_pixel = new_fit_pixel
    self.recent_fits_pixel.append(self.last_fit_pixel)