大家好,我是小F~
今天给大家介绍一个
计算机视觉实战
(
交通流量分析
)的项目。
使用OpenCV和YOLOv8检测机动车目标,
实现实时分析环形路口车流量数据~
对数据进行分析统计
,优化路口交通状况。
对机动车的管理和监控有着非常大的帮助。
首先使用conda,创建一个虚拟环境,Python版本3.10。
# 创建虚拟环境
conda create --name traffic python=3.10
下面是一些Python库的依赖,都需要安装。
pip install torch==2.3.1 torchvision==0.18.1
pip install -r requirements.txt
其中requirements.txt文件内容如下。
ultralytics==8.2.38
numpy==1.26.4
opencv-python==4.9.0.80
lapx
cython-bbox==0.1.5
shapely==2.0.3
psycopg2-binary==2.9.9
hydra-core==1.3.2
Flask==3.0.3
tensorrt==10.1.0
主程序代码如下~
import hydra
from nodes.VideoReader import VideoReader
from nodes.ShowNode import ShowNode
from nodes.VideoSaverNode import VideoSaverNode
from nodes.DetectionTrackingNodes import DetectionTrackingNodes
from nodes.TrackerInfoUpdateNode import TrackerInfoUpdateNode
from nodes.CalcStatisticsNode import CalcStatisticsNode
from nodes.SendInfoDBNode import SendInfoDBNode
from nodes.FlaskServerVideoNode import VideoServer
from elements.VideoEndBreakElement import VideoEndBreakElement
@hydra.main(version_base=None, config_path="configs", config_name="app_config")
def main(config) -> None:
video_reader = VideoReader(config["video_reader"])
detection_node = DetectionTrackingNodes(config)
tracker_info_update_node = TrackerInfoUpdateNode(config)
calc_statistics_node = CalcStatisticsNode(config)
show_node = ShowNode(config)
save_video = config["pipeline"]["save_video"]
send_info_db = config["pipeline"]["send_info_db"]
show_in_web = config["pipeline"]["show_in_web"]
if save_video:
video_saver_node = VideoSaverNode(config["video_saver_node"])
if send_info_db:
send_info_db_node = SendInfoDBNode(config)
if show_in_web:
video_server_node = VideoServer(config)
video_server_node.run()
for frame_element in video_reader.process():
frame_element = detection_node.process(frame_element)
frame_element = tracker_info_update_node.process(frame_element)
frame_element = calc_statistics_node.process(frame_element)
if send_info_db:
frame_element = send_info_db_node.process(frame_element)
frame_element = show_node.process(frame_element)
if save_video:
video_saver_node.process(frame_element)
if show_in_web:
if isinstance(frame_element, VideoEndBreakElement):
break # Обрывание обработки при окончании стрима
video_server_node.update_image(frame_element.frame_result)
if __name__ == "__main__":
main()
在启动之前,你可以在configs/app_config. yaml文件中指定所需的参数。
然后就可以运行代码。
如果在配置文件中设置如下参数时。
show_node.show_info_statistics=True
此时会显示如下画面。
会将路口车辆数据进行统计显示。
然后我们还能启用第三方服务来进行结果渲染。
在PostgreSQL数据库中记录最新的流量统计数据,以Grafana交互式Dashbord的形式进行可视化。