diff --git a/lane-finder/README.md b/lane-finder/README.md new file mode 100644 index 00000000..45e54d66 --- /dev/null +++ b/lane-finder/README.md @@ -0,0 +1,21 @@ +# Lane Finder + +This is an AI model written in python that detects and finds lanes for driverless vehicles. + +## Getting Started +Fork and clone this repo, open finding_lanes.py in any python IDE and run code. You can also change directory to this folder and run 'python finding_lanes.py' in your terminal/bash. + +### Prerequisites + +you need to have python3 installed and added to path + + +## Built With + +* [Python3](https://www.python.org) +*[OpenCV](https://opencv.org) + + +## Authors + +* **Jerry Buaba* (https://github.com/buabaj) diff --git a/lane-finder/README.md.txt b/lane-finder/README.md.txt new file mode 100644 index 00000000..6607fd52 --- /dev/null +++ b/lane-finder/README.md.txt @@ -0,0 +1,22 @@ +# Lane Finder + +This is an AI model written in python that detects and finds lanes for driverless vehicles. + +## Getting Started +Fork and clone this repo, open finding_lanes.py in any python IDE and run code. You can also change directory to this folder and run 'python finding_lanes.py' in your terminal/bash. + +### Prerequisites + +you need to have python3 installed and added to path + + +## Built With + +* [Python3](https://www.python.org) +*[OpenCV](https://opencv.org) + + +## Authors + +* **Jerry Buaba* (https://github.com/buabaj) + diff --git a/lane-finder/before.png b/lane-finder/before.png new file mode 100644 index 00000000..b9ff4e31 Binary files /dev/null and b/lane-finder/before.png differ diff --git a/lane-finder/finding_lanes.py b/lane-finder/finding_lanes.py new file mode 100644 index 00000000..84da2966 --- /dev/null +++ b/lane-finder/finding_lanes.py @@ -0,0 +1,87 @@ +import cv2 +import numpy as np + +def make_points(image, line): + slope, intercept = line + y1 = int(image.shape[0])# bottom of the image + y2 = int(y1*3/5) # slightly lower than the middle + x1 = int((y1 - intercept)/slope) + x2 = int((y2 - intercept)/slope) + return [[x1, y1, x2, y2]] + +def average_slope_intercept(image, lines): + left_fit = [] + right_fit = [] + if lines is None: + return None + for line in lines: + for x1, y1, x2, y2 in line: + fit = np.polyfit((x1,x2), (y1,y2), 1) + slope = fit[0] + intercept = fit[1] + if slope < 0: # y is reversed in image + left_fit.append((slope, intercept)) + else: + right_fit.append((slope, intercept)) + # add more weight to longer lines + left_fit_average = np.average(left_fit, axis=0) + right_fit_average = np.average(right_fit, axis=0) + left_line = make_points(image, left_fit_average) + right_line = make_points(image, right_fit_average) + averaged_lines = [left_line, right_line] + return averaged_lines + +def canny(img): + gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) + kernel = 5 + blur = cv2.GaussianBlur(gray,(kernel, kernel),0) + canny = cv2.Canny(gray, 50, 150) + return canny + +def display_lines(img,lines): + line_image = np.zeros_like(img) + if lines is not None: + for line in lines: + for x1, y1, x2, y2 in line: + cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),10) + return line_image + +def region_of_interest(canny): + height = canny.shape[0] + width = canny.shape[1] + mask = np.zeros_like(canny) + + triangle = np.array([[ + (200, height), + (550, 250), + (1100, height),]], np.int32) + + cv2.fillPoly(mask, triangle, 255) + masked_image = cv2.bitwise_and(canny, mask) + return masked_image + + +# image = cv2.imread('test_image.jpg') +# lane_image = np.copy(image) +# lane_canny = canny(lane_image) +# cropped_canny = region_of_interest(lane_canny) +# lines = cv2.HoughLinesP(cropped_canny, 2, np.pi/180, 100, np.array([]), minLineLength=40,maxLineGap=5) +# averaged_lines = average_slope_intercept(image, lines) +# line_image = display_lines(lane_image, averaged_lines) +# combo_image = cv2.addWeighted(lane_image, 0.8, line_image, 1, 0) + +# +cap = cv2.VideoCapture("test2.mp4") +while(cap.isOpened()): + _, frame = cap.read() + canny_image = canny(frame) + cropped_canny = region_of_interest(canny_image) + lines = cv2.HoughLinesP(cropped_canny, 2, np.pi/180, 100, np.array([]), minLineLength=40,maxLineGap=5) + averaged_lines = average_slope_intercept(frame, lines) + line_image = display_lines(frame, averaged_lines) + combo_image = cv2.addWeighted(frame, 0.8, line_image, 1, 1) + cv2.imshow("result", combo_image) + if cv2.waitKey(1) & 0xFF == ord('q'): + break +cap.release() +cv2.destroyAllWindows() \ No newline at end of file diff --git a/lane-finder/result.png b/lane-finder/result.png new file mode 100644 index 00000000..8316ba84 Binary files /dev/null and b/lane-finder/result.png differ diff --git a/lane-finder/test2.mp4 b/lane-finder/test2.mp4 new file mode 100644 index 00000000..13e6d1c6 Binary files /dev/null and b/lane-finder/test2.mp4 differ diff --git a/lane-finder/test_image.jpg b/lane-finder/test_image.jpg new file mode 100644 index 00000000..169df1ee Binary files /dev/null and b/lane-finder/test_image.jpg differ