我的想法就是基于当前路面车流量来自动调整红绿灯时长,虽然没有现实实现这一过程,因为受限于多种环境因素的干扰,我问了鸢尾花关于我的这个想法,下面是实现代码:
import time
import random
# 模拟传感器获取车流量数据
def get_traffic_flow():
traffic_data = {
'north_south': random.randint(10, 50), # 北南方向车流量
'east_west': random.randint(5, 25) # 东西方向车流量
}
return traffic_data
# 计算红绿灯等待时间
def calculate_wait_time(traffic_flow):
total_flow = sum(traffic_flow.values())
wait_time = {
'north_south': (traffic_flow['north_south'] / total_flow) * 60, # 北南方向等待时间
'east_west': (traffic_flow['east_west'] / total_flow) * 60 # 东西方向等待时间
}
return wait_time
# 控制红绿灯状态
def control_traffic_lights(wait_time):
# 模拟北南方向绿灯亮起
print("North-South green light is on for {} seconds.".format(wait_time['north_south']))
time.sleep(wait_time['north_south'])
# 模拟东西方向绿灯亮起
print("East-West green light is on for {} seconds.".format(wait_time['east_west']))
time.sleep(wait_time['east_west'])
if __name__ == "__main__":
while True:
traffic_flow = get_traffic_flow()
wait_time = calculate_wait_time(traffic_flow)
control_traffic_lights(wait_time)
North-South green light is on for 49.61538461538461 seconds. East-West green light is on for 10.384615384615385 seconds. North-South green light is on for 19.35483870967742 seconds. East-West green light is on for 40.64516129032258 seconds.
上面是代码运行结果,基于随机生成的车流量,设置的红绿灯他会自动更换时长。不过上述代码没有引入OpenCV,下面代码引入了OpenCV,需要引入车流量视频流进行读取训练,下面是代码实现过程:
import cv2
import time
# 获取摄像头视频流
def get_video_stream():
cap = cv2.VideoCapture(0)
return cap
# 使用背景减除法检测车辆
def detect_vehicles(frame):
fgmask = fgbg.apply(frame)
(_, thresh) = cv2.threshold(fgmask, 200, 255, cv2.THRESH_BINARY)
(_, contours, _) = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
return len(contours)
# 获取实时车流量数据
def get_traffic_flow(cap):
ret, frame = cap.read()
if not ret:
return None
vehicle_count = detect_vehicles(frame)
traffic_data = {
'north_south': vehicle_count,
'east_west': vehicle_count // 2 # 假设东西方向车流量为北南方向的一半
}
return traffic_data
# 其他函数保持不变
if __name__ == "__main__":
# 初始化背景减除法对象
fgbg = cv2.createBackgroundSubtractorMOG2()
# 获取摄像头视频流
cap = get_video_stream()
while True:
traffic_flow = get_traffic_flow(cap)
if traffic_flow is None:
print("Error: Failed to read video stream.")
break
wait_time = calculate_wait_time(traffic_flow)
control_traffic_lights(wait_time)
cap.release()
cv2.destroyAllWindows()
在这个示例代码中,我们首先使用 OpenCV 获取摄像头视频流。然后,通过 `detect_vehicles` 函数检测视频帧中的车辆。这里我们使用背景减除法进行简单的车辆检测。`get_traffic_flow` 函数获取实时车流量数据,并将其传递给原有的 `calculate_wait_time` 和 `control_traffic_lights` 函数。
请注意,这个示例代码仅供参考,实际应用中需要根据实际的摄像头和道路环境来调整代码和参数。同时,考虑使用更准确的车辆检测算法,如基于深度学习的物体检测算法。