Introduction: Traffic Pattern Analyzer Using Live Object Detection

About: The BCAMRL is a Mechatronics Research Lab, founded in 2014 on the campus of Bergen County Academies, a magnet high school within the Bergen County Technical School District. Students create innovations based o…

In today’s world, traffic lights are essential for a safe road. However, many times, traffic lights can be annoying in situations where someone is approaching the light just as it is turning red. This wastes time, especially if the light is preventing a single vehicle from getting through the intersection when there is nobody else on the road. My innovation is a smart traffic light that uses live object detection from a camera to count the number of cars on each road. The hardware I will use for this project is a Raspberry Pi 3, a camera module, and various electronic hardware for the light itself. Using OpenCV on the Raspberry Pi, the information gathered will be run through code that controls the LEDs via the GPIO. Depending on these numbers, the traffic light will change, letting cars through in the most optimal order. In this case, the lane with the most cars would be let through so that the lane with fewer cars would be idling, reducing air pollution. This would eliminate situations when many cars are stopped while there are no cars on the intersecting road. Not only does this save time for everybody, but it also saves the environment. The amount of time people are stopped at a stop sign with their engine idling increases the amount of air pollution, so by creating a smart traffic light, I am able to optimize the light patterns so that cars spend the least time possible with their vehicle stopped. Ultimately, this traffic light system could be implemented in cities, suburbs, or even rural areas to be more efficient for people would reduce air pollution.

Step 1: Parts List

Materials:

Raspberry Pi 3 Model B v1.2

Raspberry Pi Camera v2.1

5V/1A micro USB power supply

HDMI monitor, keyboard, mouse SD card with Raspbian Jessie

Raspberry Pi GPIO breakout cable

Red, yellow, green LEDs (2 of each color)

Female connectors for Raspberry Pi (7 unique colors)

Assorted 24 gauge wire (different colors) + heat shrink tubing

2’x2’ wood panel or platform

Wood screws

Black surface (cardboard, foam board, poster board, etc.)

White (or any color other than black) tape for road markings

Black spray paint (for PVC)

½” PVC pipe with 90 degree elbow joints(2), T socket (1), female adapter (2)

Tools:

Soldering Iron

3D Printer

Drill with various drill bits

Breadboard

Heat gun

Step 2: Setting Up the Raspberry Pi

Load the SD card into the Raspberry Pi and boot up.

Follow this guide to install required OpenCV libraries. Make sure you have time to do this step, as installing the OpenCV library can take a couple hours. Be sure to also install and set up your camera here.

You should also pip install:

picamera

gpiozero

RPi.GPIO


Here is the finalized code:

from picamera.array import PiRGBArray

from picamera import PiCamera

import picamera.array

import numpy as np

import time

import cv2

import RPi.GPIO as GPIO

import time

GPIO.setmode(GPIO.BCM)

for i in (23, 25, 16, 21):

GPIO.setup(i, GPIO.OUT)

cam = PiCamera()

cam.resolution=(480,480)

cam.framerate=30

raw=PiRGBArray(cam, size=(480,480))

time.sleep(0.1)

colorLower = np.array([0,100,100])

colorUpper = np.array([179,255,255])

initvert = 0

inithoriz = 0

counter = 0

for frame in cam.capture_continuous(raw, format="bgr", use_video_port=True):

frame = frame.array

hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

mask = cv2.inRange(hsv,colorLower,colorUpper)

mask = cv2.blur(mask,(3,3))

mask= cv2.dilate(mask,None,iterations=5)

mask= cv2.erode(mask,None,iterations=1)

mask= cv2.dilate(mask,None,iterations=3)

me,thresh = cv2.threshold(mask,127,255,cv2.THRESH_BINARY)

cnts = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2]

center = None

vert = 0

horiz = 0

if len(cnts) > 0:

for c in cnts:

(x,y),radius = cv2.minEnclosingCircle(c)

center = (int(x),int(y))

radius = int(radius)

cv2.circle(frame,center,radius,(0,255,0),2)

x = int(x)

y = int(y)

if 180 < x < 300:

if y > 300:

vert = vert +1

elif y < 180:

vert = vert +1

else:

vert = vert

if 180 < y < 300:

if x > 300:

horiz = horiz +1

elif x < 180:

horiz = horiz +1

else:

horiz = horiz

if vert != initvert:

print"Cars in vertical lane: " + str(vert)

initvert = vert

print"Cars in horizontal lane: " + str(horiz)

inithoriz = horiz

print '----------------------------'

if horiz != inithoriz:

print"Cars in vertical lane: " + str(vert)

initvert = vert

print"Cars in horizontal lane: " + str(horiz)

inithoriz = horiz

print '----------------------------'

if vert < horiz:

GPIO.output(23,GPIO.HIGH)

GPIO.output(21,GPIO.HIGH)

GPIO.output(16,GPIO.LOW)

GPIO.output(25,GPIO.LOW)

if horiz < vert:

GPIO.output(16,GPIO.HIGH)

GPIO.output(25,GPIO.HIGH)

GPIO.output(23,GPIO.LOW)

GPIO.output(21,GPIO.LOW)

cv2.imshow("Frame",frame)

cv2.imshow("HSV",hsv)

cv2.imshow("Thresh",thresh)

raw.truncate(0)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

cv2.destroyAllWindows()

GPIO.cleanup()

Step 3: Raspberry Pi and Camera Mount

3D print the case and camera mount and assemble.

Step 4: Traffic Light Assembly

Test out the traffic light with a breadboard. Each opposing set of LEDs share an anode, and all of them share a common cathode (ground). There should be a total of 7 input wires: 1 for each pair of LEDS (6) + 1 ground wire. Solder and assemble the traffic lights.

Step 5: Wiring (Part 1)

Solder the female header pins to about 5 feet of wire. These are the sides that These wires will snake through the PVC pipes later on. Be sure to be able to distinguish the different sets of lights (2 x 3 colors and 1 ground). In this case, I marked the ends of another set of red, yellow, and blue wires with sharpie so I know which is which.

Step 6: Building the Environment

Building the environment Make a 2 feet square wood pallet like this. Scrap wood is fine as it will be covered up. Drill a hole that just fits your adapter. Drill screws through the sides of the pallet to secure the PVC pipe into place. Cut the black foam board to match the wood pallet underneath. Drill a hole that fits around the PVC pipe. Repeat on the opposite corner. Mark the roads with some white tape.

Step 7: Finalizing the PVC Frame

On the top pipe, drill a hole that can fit a bundle of wires. A rough hole is fine as long as you can access the insides of the pipes. Snake the wires through the PVC pipes and elbow joints for a test fit. Once everything is finalized, paint the PVC with some black spray paint to clean up the look of the main frame. Cut a small gap in one of the PVC pipes to fit a T-joint. Add a PVC pipe to this t-joint for the traffic light to hang down from. The diameter could be the same as the main frame (1/2"), though if you use a thinner pipe, make sure the 7 wires can snake through. Drill a hole through this pipe for the traffic light to hang from.

Step 8: Wiring (Part 2)

Re-wire everything as tested previously. Double check the traffic light and wiring with a breadboard to confirm all the connections have been made. Solder the traffic light to the wires coming through the T-joint arm. Wrap the exposed wires with electrical tape to prevent any shorts and for a cleaner look.

Step 9: Finished!

To run the code, be sure to set your source as ~/.profile and cd to your project location.

Step 10: Extras (Photos)

Step 11: