一、课题背景与意义
随着现代交通运输系统的日益发展和汽车数量的不断增加,如何提高行车安全性,避免交通事故,成为了交通管理的重中之重。尤其在高速公路、城市街道等高密度、复杂的交通环境下,车距的保持对于避免追尾事故至关重要。车距不足可能导致碰撞事故的发生,而车距过大又会导致交通流量降低。因此,车距检测技术成为了一项重要的研究课题,它能够为驾驶员提供安全行驶的依据。
目前,尽管很多高端汽车已经配备了自适应巡航控制(ACC)和碰撞预警系统等辅助驾驶技术,但这些技术一般都依赖于高成本的传感器,如雷达和激光雷达(LiDAR)。这些传感器的成本较高,且对于低成本或老旧车辆而言不可行。而图像处理技术,特别是利用普通摄像头结合计算机视觉技术进行车距检测,为低成本、高效率的车距检测提供了一种可行的解决方案。
本课题旨在设计一个基于OpenCV的车距检测系统,通过分析车辆的实时视频图像来估算车距,结合目标检测、目标跟踪和距离估计算法,为驾驶员提供实时车距反馈,并根据车距的变化进行预警提示。该系统具有广泛的应用前景,能够有效提高车辆行驶的安全性,尤其在低成本车辆中具有较高的普及价值。
二、课题目标与研究内容
1. 研究目标
本课题的主要目标是设计并实现一个基于OpenCV的车距检测系统,系统的核心功能包括:
通过视频流实时检测道路上行驶的车辆;
计算并估算与前方车辆的实际车距;
当车距过短时,系统能够发出预警信号,提示驾驶员注意安全车距。
具体来说,本课题将结合目标检测、目标跟踪和距离估计等计算机视觉算法,设计一个低成本、高实时性的车距检测系统,并对系统性能进行全面评估。
2. 研究内容
视频输入与预处理:使用视频流作为输入,通过图像处理技术进行预处理,去除噪声、调整图像大小、增强图像特征,以确保后续处理的效果。
车辆检测:采用YOLOv3(You Only Look Once)等先进的深度学习目标检测算法,对视频帧中的车辆进行检测,获取车辆的边界框信息。
目标跟踪:实现目标跟踪算法,跟踪检测到的车辆并保持目标信息的持续更新。
距离估计:基于单目视觉,通过计算车辆的像素宽度与实际宽度的比例,结合相机的焦距,估算与前方车辆的实际距离。
预警功能:根据实时计算的车距与预设的安全距离阈值对比,如果车距过短,则触发警告信号,提醒驾驶员及时调整车速或与前车保持更大的距离。
系统性能评估:通过实验数据验证系统的准确性、实时性,并对系统性能进行优化分析。
三、技术路线与实现方法
1. 技术路线
本课题主要采用计算机视觉技术与深度学习相结合的方式,利用OpenCV库进行图像处理和系统实现。具体技术路线如下:
graph TD
A[视频输入] --> B[帧预处理]
B --> C[车辆检测]
C --> D[目标跟踪]
D --> E[距离估计]
E --> F[预警判断]
F --> G[结果可视化]
视频输入与帧预处理:
通过OpenCV的VideoCapture函数读取视频文件或实时视频流,提取每一帧图像。
对图像进行灰度化、归一化、去噪等基础图像处理,以提高后续算法的处理效果,减少噪声对检测结果的影响。
车辆检测:
使用YOLOv3模型进行实时目标检测,YOLOv3能够在较高的帧率下提供较为准确的目标检测结果。通过此算法,能够准确识别视频帧中的车辆,并输出车辆在图像中的位置(即边界框)。
目标跟踪:
采用自定义的质心跟踪算法来跟踪每一个检测到的车辆。该算法通过计算每一帧中车辆的位置与前一帧的差异,保证在车辆检测不到时仍能持续追踪目标。
距离估计:
基于相似三角形原理,通过已知的标准车型宽度和车辆在图像中的像素宽度,结合相机的焦距来估算前车的距离。这种方法避免了使用激光雷达或雷达等昂贵传感器,降低了成本。
预警判断:
当估算的车距小于设定的安全距离阈值时,系统会触发预警,并以声音或图像提示驾驶员,确保驾驶安全。
结果可视化:
在图像中绘制检测到的车辆边界框、车距值以及预警状态,提供直观的结果展示。
2. 具体方法
YOLOv3目标检测:
YOLOv3是当前广泛使用的深度学习目标检测算法,其优势在于高精度与高速度,适合实时视频处理。通过训练YOLOv3模型,能够在视频帧中准确检测到车辆的边界框。
质心跟踪算法:
对于目标跟踪,采用了基于质心的跟踪算法,该算法通过计算每个车辆的质心位置(即车辆的中心坐标),并通过欧氏距离算法与上一帧的质心位置进行匹配,从而实现对目标的持续跟踪。
单目视觉车距估计:
基于单目相机,通过已知的标准车型宽度和图像中车辆的像素宽度之间的比例关系,结合相机的焦距来估算车辆的距离。这种方法不仅具有较高的准确性,还避免了多目视觉或激光雷达的硬件成本。
车距预警与报警:
通过设定一个安全车距阈值(例如:2秒的安全跟车距离),当估算的车距小于这个阈值时,系统会触发预警,提醒驾驶员保持安全车距。
四、主要技术与创新点
1. 目标检测与跟踪
YOLOv3目标检测:YOLOv3作为一种基于深度学习的目标检测算法,其通过全卷积网络将图像分割成多个网格单元,然后每个网格单元独立地预测包含目标的边界框及其类别。相比传统的滑动窗口检测方法,YOLOv3具有更高的处理速度和准确度。
多目标跟踪:采用基于质心的多目标跟踪算法,通过计算检测到的车辆在每帧图像中的质心位置,保持对每辆车的持续跟踪,避免了目标丢失和误识别的情况。
2. 距离估计
基于单目视觉的距离估计方法,通过计算车辆在图像中的像素宽度与实际车辆宽度的比例,结合相机的标定参数(焦距等),准确估算出车辆之间的距离。
该方法避免了高昂的硬件成本(如雷达和激光雷达),通过标准化的标定参数和简单的几何计算,能够以较低的成本提供可靠的车距估算。
3. 实时预警功能
通过设定车距的安全阈值,当系统检测到车辆之间的距离过短时,能够及时触发警告信号。该功能能够有效提高驾驶员的安全意识,减少因车距过短而导致的追尾事故。
4. 可视化展示
系统能够实时显示车辆检测与车距估算结果,并通过图像标注的方式将警告信息展示给驾驶员,提供清晰直观的结果展示。
五、系统设计与实现
1. 系统架构
本车距检测系统的整体架构采用模块化设计,每个模块负责特定的功能,主要模块包括:
视频输入与图像预处理模块:通过OpenCV读取视频流,对每一帧图像进行去噪、灰度化等预处理。
车辆检测模块:使用YOLOv3算法进行车辆的目标检测,输出车辆的边界框信息。
以下是一个基于OpenCV的车距检测系统的完整本科毕设核心代码参考案例实现,包含单目视觉测距、车辆检测与跟踪、安全预警等功能模块:
import cv2
import numpy as np
import math
from collections import deque
class VehicleDistanceDetector:
def __init__(self):
# 相机参数(需标定获得)
self.focal_length = 1200 # 焦距(像素单位)
self.car_width = 1.8 # 车辆平均宽度(米)
# 车辆检测模型
self.net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
self.classes = []
with open("coco.names", "r") as f:
self.classes = [line.strip() for line in f.readlines()]
self.layer_names = self.net.getLayerNames()
self.output_layers = [self.layer_names[i - 1] for i in self.net.getUnconnectedOutLayers()]
# 跟踪器
self.tracked_vehicles = {}
self.track_id = 0
self.max_disappeared = 5 # 最大消失帧数
# 距离阈值(米)
self.safe_distance = 5.0
self.warning_distance = 3.0
self.danger_distance = 1.5
# 可视化设置
self.color_map = {
"safe": (0, 255, 0), # 绿色
"warning": (0, 255, 255), # 黄色
"danger": (0, 0, 255) # 红色
}
# 帧处理队列
self.frame_queue = deque(maxlen=5)
def _calculate_distance(self, width_in_pixels):
"""根据车辆像素宽度计算实际距离"""
if width_in_pixels == 0:
return float('inf')
return (self.car_width * self.focal_length) / width_in_pixels
def _detect_vehicles(self, frame):
"""使用YOLOv3检测车辆"""
height, width = frame.shape[:2]
# 预处理
blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
self.net.setInput(blob)
outs = self.net.forward(self.output_layers)
# 解析检测结果
boxes = []
confidences = []
class_ids = []
for out in outs:
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
# 只保留汽车、卡车、公交车等类别
if confidence > 0.5 and class_id in [2, 5, 7]:
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)
# 矩形框坐标
x = int(center_x - w / 2)
y = int(center_y - h / 2)
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
# 非极大值抑制
indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
vehicles = []
for i in indices:
box = boxes[i]
vehicles.append({
"box": box,
"confidence": confidences[i],
"class_id": class_ids[i]
})
return vehicles
def _update_tracker(self, detections):
"""更新车辆跟踪状态"""
# 初始化返回结果
tracked_objects = {}
# 如果没有检测到车辆,更新所有跟踪器的disappeared计数
if len(detections) == 0:
for object_id in list(self.tracked_vehicles.keys()):
self.tracked_vehicles[object_id]["disappeared"] += 1
if self.tracked_vehicles[object_id]["disappeared"] > self.max_disappeared:
del self.tracked_vehicles[object_id]
return tracked_objects
# 当前帧的检测框中心点
centroids = np.zeros((len(detections), 2), dtype="int")
for (i, detection) in enumerate(detections):
(x, y, w, h) = detection["box"]
cx = x + w // 2
cy = y + h // 2
centroids[i] = (cx, cy)
# 如果是第一次检测,初始化所有跟踪器
if len(self.tracked_vehicles) == 0:
for i in range(len(detections)):
self.tracked_vehicles[self.track_id] = {
"centroid": centroids[i],
"bbox": detections[i]["box"],
"disappeared": 0,
"distance_history": deque(maxlen=10)
}
self.track_id += 1
else:
# 计算现有跟踪对象与新检测对象的欧氏距离
object_ids = list(self.tracked_vehicles.keys())
object_centroids = [self.tracked_vehicles[obj_id]["centroid"] for obj_id in object_ids]
# 计算距离矩阵
D = np.zeros((len(object_ids), len(detections)), dtype="float")
for i in range(len(object_ids)):
for j in range(len(detections)):
D[i, j] = math.sqrt(
(object_centroids[i][0] - centroids[j][0])**2 +
(object_centroids[i][1] - centroids[j][1])**2
)
# 匈牙利算法匹配
rows = D.min(axis=1).argsort()
cols = D.argmin(axis=1)[rows]
used_rows = set()
used_cols = set()
for (row, col) in zip(rows, cols):
if row in used_rows or col in used_cols:
continue
object_id = object_ids[row]
self.tracked_vehicles[object_id]["centroid"] = centroids[col]
self.tracked_vehicles[object_id]["bbox"] = detections[col]["box"]
self.tracked_vehicles[object_id]["disappeared"] = 0
tracked_objects[object_id] = self.tracked_vehicles[object_id]
used_rows.add(row)
used_cols.add(col)
# 处理未匹配的检测(新出现的车辆)
unused_cols = set(range(len(detections))) - used_cols
for col in unused_cols:
self.tracked_vehicles[self.track_id] = {
"centroid": centroids[col],
"bbox": detections[col]["box"],
"disappeared": 0,
"distance_history": deque(maxlen=10)
}
tracked_objects[self.track_id] = self.tracked_vehicles[self.track_id]
self.track_id += 1
# 处理未匹配的跟踪(消失的车辆)
unused_rows = set(range(len(object_ids))) - used_rows
for row in unused_rows:
object_id = object_ids[row]
self.tracked_vehicles[object_id]["disappeared"] += 1
if self.tracked_vehicles[object_id]["disappeared"] > self.max_disappeared:
del self.tracked_vehicles[object_id]
return tracked_objects
def _estimate_distance(self, tracked_objects):
"""估计并更新车辆距离"""
for object_id, obj in tracked_objects.items():
(x, y, w, h) = obj["bbox"]
distance = self._calculate_distance(w)
obj["distance_history"].append(distance)
# 使用历史距离的平均值
avg_distance = sum(obj["distance_history"]) / len(obj["distance_history"])
tracked_objects[object_id]["current_distance"] = avg_distance
# 判断距离级别
if avg_distance <= self.danger_distance:
tracked_objects[object_id]["status"] = "danger"
elif avg_distance <= self.warning_distance:
tracked_objects[object_id]["status"] = "warning"
else:
tracked_objects[object_id]["status"] = "safe"
return tracked_objects
def process_frame(self, frame):
"""处理视频帧"""
# 车辆检测
vehicles = self._detect_vehicles(frame)
# 更新跟踪器
tracked_objects = self._update_tracker(vehicles)
# 距离估计
tracked_objects = self._estimate_distance(tracked_objects)
# 可视化
result_frame = self._visualize(frame, tracked_objects)
return result_frame, tracked_objects
def _visualize(self, frame, tracked_objects):
"""可视化检测结果"""
for object_id, obj in tracked_objects.items():
(x, y, w, h) = obj["bbox"]
distance = obj["current_distance"]
status = obj["status"]
# 绘制边界框
color = self.color_map[status]
cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
# 显示ID和距离
label = f"ID:{object_id} {distance:.1f}m"
cv2.putText(frame, label, (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
# 状态提示
if status == "danger":
warning_text = "DANGER! TOO CLOSE!"
text_size = cv2.getTextSize(warning_text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2)[0]
cv2.putText(frame, warning_text,
((frame.shape[1] - text_size[0]) // 2, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# 显示最近距离
if tracked_objects:
min_distance = min([obj["current_distance"] for obj in tracked_objects.values()])
cv2.putText(frame, f"Min Distance: {min_distance:.1f}m",
(20, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2)
return frame
def main():
# 初始化检测器
detector = VehicleDistanceDetector()
# 视频源(0-摄像头,或视频文件路径)
video_source = "test_video.mp4"
cap = cv2.VideoCapture(video_source)
# 视频输出设置
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0,
(int(cap.get(3)), int(cap.get(4))))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 处理帧
processed_frame, distances = detector.process_frame(frame)
# 显示结果
cv2.imshow("Vehicle Distance Detection", processed_frame)
out.write(processed_frame)
# 退出键
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
代码说明文档
1. 系统架构
该车距检测系统采用模块化设计,主要包含以下功能模块:
车辆检测:基于YOLOv3深度学习模型
目标跟踪:基于质心跟踪算法
距离估计:单目视觉几何测距
安全预警:三级距离预警系统
可视化界面:实时显示检测结果
2. 关键技术实现
相机标定参数:
focal_length:相机焦距(需通过标定获得)
car_width:车辆平均宽度(先验知识)
距离计算公式:
distance=real_width×focal_lengthpixel_width ext{distance} = frac{ ext{real\_width} imes ext{focal\_length}}{ ext{pixel\_width}} distance=pixel_widthreal_width×focal_length
多目标跟踪:
使用匈牙利算法进行检测框匹配
消失帧数计数管理
三级预警机制:
安全距离(>5m):绿色框
警告距离(3-5m):黄色框
危险距离(<1.5m):红色框+文字警示
3. 使用方法
准备YOLOv3模型文件:
下载yolov3.weights、yolov3.cfg和coco.names
放置在与脚本相同的目录下
运行程序:
python vehicle_distance.py
参数调整:
修改video_source变量切换视频源
调整safe_distance等阈值参数
4. 扩展建议
相机标定:使用OpenCV的棋盘格标定获取精确的焦距参数
模型优化:替换为YOLOv4或YOLOv7提升检测精度
多传感器融合:结合雷达数据进行距离验证
三维测距:使用双目视觉实现更精确的测距
分步骤进行解析:
1. 算法整体架构
graph TD
A[视频输入] --> B[帧预处理]
B --> C[车辆检测]
C --> D[目标跟踪]
D --> E[距离估计]
E --> F[预警判断]
F --> G[结果可视化]
2. 核心模块实现
2.1 相机标定与参数准备
def load_camera_params(config_file):
"""加载相机标定参数"""
import json
with open(config_file) as f:
params = json.load(f)
return params
# 标定参数示例
camera_params = {
"focal_length": 1250, # 像素单位
"sensor_width": 4.8, # 毫米
"frame_width": 1920, # 像素
"car_width_ref": 1.8 # 标准车辆宽度(米)
}
2.2 车辆检测模块
YOLOv3检测实现:
class VehicleDetector:
def __init__(self):
self.net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
self.classes = ["car", "truck", "bus"]
self.conf_threshold = 0.5
self.nms_threshold = 0.4
def detect(self, frame):
height, width = frame.shape[:2]
blob = cv2.dnn.blobFromImage(frame, 1/255, (416,416), swapRB=True)
self.net.setInput(blob)
outs = self.net.forward(self._get_output_layers())
boxes, confs, class_ids = [], [], []
for out in outs:
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > self.conf_threshold and
self.classes[class_id] in self.classes:
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)
x = center_x - w // 2
y = center_y - h // 2
boxes.append([x, y, w, h])
confs.append(float(confidence))
class_ids.append(class_id)
indices = cv2.dnn.NMSBoxes(boxes, confs, self.conf_threshold, self.nms_threshold)
return [boxes[i] for i in indices]
2.3 目标跟踪模块
改进的质心跟踪算法:
class CentroidTracker:
def __init__(self, max_disappeared=5):
self.next_id = 0
self.objects = {}
self.disappeared = {}
self.max_disappeared = max_disappeared
def update(self, rects):
new_objects = {}
# 当前帧物体中心点计算
centroids = np.zeros((len(rects), 2), dtype="int")
for (i, (x, y, w, h)) in enumerate(rects):
cx = x + w // 2
cy = y + h // 2
centroids[i] = (cx, cy)
# 首帧初始化
if len(self.objects) == 0:
for i in range(len(centroids)):
self.objects[self.next_id] = centroids[i]
self.disappeared[self.next_id] = 0
self.next_id += 1
else:
# 计算所有欧式距离
object_ids = list(self.objects.keys())
object_centroids = list(self.objects.values())
D = np.zeros((len(object_centroids), len(centroids)), dtype=np.float32)
for i in range(len(object_centroids)):
for j in range(len(centroids)):
D[i, j] = np.linalg.norm(object_centroids[i] - centroids[j])
# 匈牙利算法匹配
rows = D.min(axis=1).argsort()
cols = D.argmin(axis=1)[rows]
used_rows, used_cols = set(), set()
for (row, col) in zip(rows, cols):
if row in used_rows or col in used_cols:
continue
object_id = object_ids[row]
new_objects[object_id] = centroids[col]
self.disappeared[object_id] = 0
used_rows.add(row)
used_cols.add(col)
# 处理未匹配对象
unused_rows = set(range(D.shape[0])) - used_rows
unused_cols = set(range(D.shape[1])) - used_cols
for row in unused_rows:
object_id = object_ids[row]
self.disappeared[object_id] += 1
if self.disappeared[object_id] > self.max_disappeared:
del self.objects[object_id]
del self.disappeared[object_id]
for col in unused_cols:
self.objects[self.next_id] = centroids[col]
self.disappeared[self.next_id] = 0
self.next_id += 1
return new_objects
2.4 距离估计算法
单目测距实现:
class DistanceEstimator:
def __init__(self, params):
self.focal = params["focal_length"]
self.ref_width = params["car_width_ref"]
def calculate_distance(self, pixel_width):
"""基于相似三角形原理的距离计算"""
if pixel_width <= 0:
return float('inf')
return (self.ref_width * self.focal) / pixel_width
def refine_distance(self, distances, method='median'):
"""距离值滤波优化"""
if method == 'median':
return np.median(distances)
elif method == 'mean':
return np.mean(distances)
else:
return distances[-1]
2.5 预警系统实现
class SafetyMonitor:
LEVELS = {
"safe": (5.0, float('inf'), (0, 255, 0)),
"warning": (3.0, 5.0, (0, 255, 255)),
"danger": (0, 3.0, (0, 0, 255))
}
def check_level(self, distance):
for level, (min_d, max_d, color) in self.LEVELS.items():
if min_d <= distance < max_d:
return level, color
return "unknown", (255, 255, 255)
def audio_alert(self, level):
if level == "danger":
# 播放报警音效
import winsound
winsound.Beep(2000, 500)
3. 主系统集成
class VehicleDistanceSystem:
def __init__(self):
self.camera_params = load_camera_params("camera.json")
self.detector = VehicleDetector()
self.tracker = CentroidTracker()
self.estimator = DistanceEstimator(self.camera_params)
self.monitor = SafetyMonitor()
# 历史数据缓存
self.distance_history = {}
def process_frame(self, frame):
# 车辆检测
boxes = self.detector.detect(frame)
# 目标跟踪
tracked_objs = self.tracker.update(boxes)
# 距离计算与预警
results = []
for obj_id, centroid in tracked_objs.items():
x, y, w, h = boxes[obj_id]
# 距离估计
distance = self.estimator.calculate_distance(w)
# 缓存历史数据
if obj_id not in self.distance_history:
self.distance_history[obj_id] = deque(maxlen=10)
self.distance_history[obj_id].append(distance)
# 距离滤波
filtered_dist = self.estimator.refine_distance(
list(self.distance_history[obj_id])
)
# 安全评估
level, color = self.monitor.check_level(filtered_dist)
results.append({
"id": obj_id,
"bbox": (x, y, w, h),
"distance": filtered_dist,
"level": level,
"color": color
})
return frame, results
def visualize(self, frame, results):
for obj in results:
x, y, w, h = obj["bbox"]
# 绘制边界框
cv2.rectangle(frame, (x,y), (x+w,y+h), obj["color"], 2)
# 显示信息
text = f"ID:{obj['id']} {obj['distance']:.1f}m"
cv2.putText(frame, text, (x, y-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, obj["color"], 2)
# 危险状态特殊提示
if obj["level"] == "danger":
cv2.putText(frame, "DANGER!", (x, y+h+20),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,255), 2)
# 显示最近车距
if results:
min_dist = min([obj["distance"] for obj in results])
cv2.putText(frame, f"Min Distance: {min_dist:.1f}m",
(20,40), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255,255,255), 2)
return frame
4. 完整运行示例
def main():
system = VehicleDistanceSystem()
cap = cv2.VideoCapture("highway.mp4")
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 处理帧
processed_frame, results = system.process_frame(frame)
output_frame = system.visualize(processed_frame, results)
# 显示结果
cv2.imshow("Vehicle Distance Monitor", output_frame)
if cv2.waitKey(30) == 27: # ESC退出
break
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
5. 关键优化技术
距离计算优化:
# 动态焦距调整(根据车辆位置)
def dynamic_focal_length(self, y_pos, frame_height):
"""考虑透视效应的动态焦距"""
baseline_focal = self.focal
pos_ratio = y_pos / frame_height
return baseline_focal * (1 + 0.5 * pos_ratio)
多目标跟踪改进:
# 添加速度预测
def predict_position(self, obj_id):
history = self.positions[obj_id]
if len(history) >= 2:
vx = history[-1][0] - history[-2][0]
vy = history[-1][1] - history[-2][1]
return (history[-1][0]+vx, history[-1][1]+vy)
return history[-1]
夜间模式增强:
def enhance_night_vision(image):
lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
l_enhanced = clahe.apply(l)
lab_enhanced = cv2.merge((l_enhanced,a,b))
return cv2.cvtColor(lab_enhanced, cv2.COLOR_LAB2BGR)


![[12月9日更新] 将word文档试卷整理成填空,并自动将答案在页尾整理成新的一页 - 宋马](https://pic.songma.com/blogimg/20250416/6e734315e61d4fa9ae02289498e4527f..png)















暂无评论内容