Assignment_2

This commit is contained in:
SKT-Sukatat 2023-10-19 14:40:45 +07:00
parent 5c231bad3d
commit d99d74d557
8 changed files with 368 additions and 0 deletions

View File

@ -0,0 +1,32 @@
import cv2
# read webcam
webcam = cv2.VideoCapture(0)
# visualize webcam
while True:
ret, frame = webcam.read()
# Three vertices(tuples) of the triangle
p1 = (0, 20)
p2 = (640, 20)
p3 = (320, 480)
# Drawing the triangle with the help of lines
# on the black window With given points
# cv2.line is the inbuilt function in opencv library
cv2.line(frame, p1, p2, (255, 0, 0), 3)
cv2.line(frame, p2, p3, (255, 0, 0), 3)
cv2.line(frame, p1, p3, (255, 0, 0), 3)
cv2.putText(frame, 'Hello World', (240, 240), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 4)
cv2.imshow('frame', frame)
if cv2.waitKey(40) & 0xFF == ord('q'):
break
webcam.release()
cv2.destroyAllWindows()

View File

@ -0,0 +1,42 @@
import cv2
import numpy as np
# read webcam
webcam = cv2.VideoCapture(0)
# visualize webcam
while True:
ret, frame = webcam.read()
Blur = cv2.medianBlur(frame,3)
dimensions = frame.shape
grayimg = cv2.cvtColor(Blur, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(grayimg, cv2.HOUGH_GRADIENT,1.2,dimensions[0]/50)
thickness = 2
#Draw detected circles
if circles is not None:
print("Found circle")
circles = np.uint16(circles[0,:])
#print(circles)
print(type(circles.shape))
for (x, y, diameter) in circles:
#draw the outer circle
cv2.circle(frame, (x,y), diameter, (0,0,255), thickness, cv2.LINE_AA)
#draw the outer circle
cv2.circle(frame, (x,y), 2, (0,0,255), thickness, cv2.LINE_AA)
cv2.putText(frame, 'Total Circles: ' + str(circles.shape[0]), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 4)
else:
print("Cannot detect circle.")
cv2.imshow('frame', frame)
if cv2.waitKey(40) & 0xFF == ord('q'):
break
webcam.release()
cv2.destroyAllWindows()

View File

@ -0,0 +1,194 @@
import numpy as np
import pandas as pd
import cv2
#from google.colab.patches import cv2_imshow
#Import everything needed to edit/save/watch video clips
from moviepy import editor
import moviepy
def region_selection(image):
"""
Determine and cut the region of interest in the input image.
Parameters:
image: we pass here the output from canny where we have
identified edges in the frame
"""
# create an array of the same size as of the input image
mask = np.zeros_like(image)
# if you pass an image with more then one channel
if len(image.shape) > 2:
channel_count = image.shape[2]
ignore_mask_color = (255,) * channel_count
# our image only has one channel so it will go under "else"
else:
# color of the mask polygon (white)
ignore_mask_color = 255
# creating a polygon to focus only on the road in the picture
# we have created this polygon in accordance to how the camera was placed
rows, cols = image.shape[:2]
bottom_left = [cols * 0.1, rows * 0.95]
top_left = [cols * 0.4, rows * 0.6]
bottom_right = [cols * 0.9, rows * 0.95]
top_right = [cols * 0.6, rows * 0.6]
vertices = np.array([[bottom_left, top_left, top_right, bottom_right]], dtype=np.int32)
# filling the polygon with white color and generating the final mask
cv2.fillPoly(mask, vertices, ignore_mask_color)
# performing Bitwise AND on the input image and mask to get only the edges on the road
masked_image = cv2.bitwise_and(image, mask)
return masked_image
def hough_transform(image):
"""
Determine and cut the region of interest in the input image.
Parameter:
image: grayscale image which should be an output from the edge detector
"""
# Distance resolution of the accumulator in pixels.
rho = 1
# Angle resolution of the accumulator in radians.
theta = np.pi/180
# Only lines that are greater than threshold will be returned.
threshold = 20
# Line segments shorter than that are rejected.
minLineLength = 20
# Maximum allowed gap between points on the same line to link them
maxLineGap = 500
# function returns an array containing dimensions of straight lines
# appearing in the input image
return cv2.HoughLinesP(image, rho = rho, theta = theta, threshold = threshold,
minLineLength = minLineLength, maxLineGap = maxLineGap)
def average_slope_intercept(lines):
"""
Find the slope and intercept of the left and right lanes of each image.
Parameters:
lines: output from Hough Transform
"""
left_lines = [] #(slope, intercept)
left_weights = [] #(length,)
right_lines = [] #(slope, intercept)
right_weights = [] #(length,)
for line in lines:
for x1, y1, x2, y2 in line:
if x1 == x2:
continue
# calculating slope of a line
slope = (y2 - y1) / (x2 - x1)
# calculating intercept of a line
intercept = y1 - (slope * x1)
# calculating length of a line
length = np.sqrt(((y2 - y1) ** 2) + ((x2 - x1) ** 2))
# slope of left lane is negative and for right lane slope is positive
if slope < 0:
left_lines.append((slope, intercept))
left_weights.append((length))
else:
right_lines.append((slope, intercept))
right_weights.append((length))
#
left_lane = np.dot(left_weights, left_lines) / np.sum(left_weights) if len(left_weights) > 0 else None
right_lane = np.dot(right_weights, right_lines) / np.sum(right_weights) if len(right_weights) > 0 else None
return left_lane, right_lane
def pixel_points(y1, y2, line):
"""
Converts the slope and intercept of each line into pixel points.
Parameters:
y1: y-value of the line's starting point.
y2: y-value of the line's end point.
line: The slope and intercept of the line.
"""
if line is None:
return None
slope, intercept = line
x1 = int((y1 - intercept)/slope)
x2 = int((y2 - intercept)/slope)
y1 = int(y1)
y2 = int(y2)
return ((x1, y1), (x2, y2))
def lane_lines(image, lines):
"""
Create full lenght lines from pixel points.
Parameters:
image: The input test image.
lines: The output lines from Hough Transform.
"""
left_lane, right_lane = average_slope_intercept(lines)
y1 = image.shape[0]
y2 = y1 * 0.6
left_line = pixel_points(y1, y2, left_lane)
right_line = pixel_points(y1, y2, right_lane)
return left_line, right_line
def draw_lane_lines(image, lines, color=[255, 0, 0], thickness=12):
"""
Draw lines onto the input image.
Parameters:
image: The input test image (video frame in our case).
lines: The output lines from Hough Transform.
color (Default = red): Line color.
thickness (Default = 12): Line thickness.
"""
line_image = np.zeros_like(image)
for line in lines:
if line is not None:
cv2.line(line_image, *line, color, thickness)
return cv2.addWeighted(image, 1.0, line_image, 1.0, 0.0)
def frame_processor(image):
"""
Process the input frame to detect lane lines.
Parameters:
image: image of a road where one wants to detect lane lines
(we will be passing frames of video to this function)
"""
# convert the RGB image to Gray scale
grayscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# applying gaussian Blur which removes noise from the image
# and focuses on our region of interest
# size of gaussian kernel
kernel_size = 5
# Applying gaussian blur to remove noise from the frames
blur = cv2.GaussianBlur(grayscale, (kernel_size, kernel_size), 0)
# first threshold for the hysteresis procedure
low_t = 50
# second threshold for the hysteresis procedure
high_t = 150
# applying canny edge detection and save edges in a variable
edges = cv2.Canny(blur, low_t, high_t)
# since we are getting too many edges from our image, we apply
# a mask polygon to only focus on the road
# Will explain Region selection in detail in further steps
region = region_selection(edges)
# Applying hough transform to get straight lines from our image
# and find the lane lines
# Will explain Hough Transform in detail in further steps
hough = hough_transform(region)
#lastly we draw the lines on our resulting frame and return it as output
result = draw_lane_lines(image, lane_lines(image, hough))
return result
# driver function
def process_video(test_video, output_video):
"""
Read input video stream and produce a video file with detected lane lines.
Parameters:
test_video: location of input video file
output_video: location where output video file is to be saved
"""
# read the video file using VideoFileClip without audio
input_video = editor.VideoFileClip(test_video, audio=False)
# apply the function "frame_processor" to each frame of the video
# will give more detail about "frame_processor" in further steps
# "processed" stores the output video
processed = input_video.fl_image(frame_processor)
# save the output video stream to an mp4 file
processed.write_videofile(output_video, audio=False)
# calling driver function
#process_video('input.mp4','output.mp4')

View File

@ -0,0 +1,35 @@
import numpy as np
import cv2
names = ['input.mp4', 'output.mp4']
window_titles = ['input', 'output']
cap = [cv2.VideoCapture(i) for i in names]
frames = [None] * len(names);
gray = [None] * len(names);
ret = [None] * len(names);
while True:
for i,c in enumerate(cap):
if c is not None:
ret[i], frames[i] = c.read();
for i,f in enumerate(frames):
if ret[i] is True:
#gray[i] = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
#cv2.imshow(window_titles[i], gray[i]);
cv2.imshow(window_titles[i], frames[i]);
if cv2.waitKey(1) & 0xFF == ord('q'):
break
for c in cap:
if c is not None:
c.release();
cv2.destroyAllWindows()

View File

@ -0,0 +1,34 @@
import face_recognition
import cv2
# read webcam
video_capture = cv2.VideoCapture(0)
# visualize webcam
winname = "Test"
while True:
ret, frame = video_capture.read()
face_location = face_recognition.face_locations(frame)
print(face_location)
#print("There are " + str(len(face_location)) + " people in this image.")
if(len(face_location) > 0):
for index in range(0, len(face_location)):
x0 = face_location[index][3] #left
y0 = face_location[index][0] #Top
x1 = face_location[index][1] #Bottom
y1 = face_location[index][2] #Right
cv2.rectangle(frame, (x0, y0), (x1,y1), (255,0,0),3)
cv2.putText(frame, 'Total People: ' + str(len(face_location)), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 4)
cv2.namedWindow(winname)
cv2.moveWindow(winname, 40,30) # Move it to (40,30)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
webcam.release()
cv2.destroyAllWindows()

View File

@ -0,0 +1,31 @@
import cv2
vcap = cv2.VideoCapture(0) # built-in webcamera
#vcap = cv2.VideoCapture('video.avi')
if vcap.isOpened():
width = vcap.get(cv2.CAP_PROP_FRAME_WIDTH) # float `width`
height = vcap.get(cv2.CAP_PROP_FRAME_HEIGHT) # float `height`
# or
width = vcap.get(3) # float `width`
height = vcap.get(4) # float `height`
print('width, height:', width, height)
fps = vcap.get(cv2.CAP_PROP_FPS)
# or
fps = vcap.get(5)
print('fps:', fps) # float `fps`
frame_count = vcap.get(cv2.CAP_PROP_FRAME_COUNT)
# or
frame_count = vcap.get(7)
print('frames count:', frame_count) # float `frame_count`
#print('cv2.CAP_PROP_FRAME_WIDTH :', cv2.CAP_PROP_FRAME_WIDTH) # 3
#print('cv2.CAP_PROP_FRAME_HEIGHT:', cv2.CAP_PROP_FRAME_HEIGHT) # 4
#print('cv2.CAP_PROP_FPS :', cv2.CAP_PROP_FPS) # 5
#print('cv2.CAP_PROP_FRAME_COUNT :', cv2.CAP_PROP_FRAME_COUNT) # 7

BIN
Assignment 2/input.mp4 Normal file

Binary file not shown.

BIN
Assignment 2/output.mp4 Normal file

Binary file not shown.