Python路面车道线识别偏离预警

程序示例精选
Python路面车道线识别偏离预警
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!

前言

这篇博客针对《Python路面车道线识别偏离预警》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。


运行结果


文章目录

一、所需工具软件
二、使用步骤
       1. 主要代码
       2. 运行结果
三、在线协助

一、所需工具软件

       1. Python
       2. Pycharm

二、使用步骤

代码如下(示例):

import os
from PyQt5.QtWidgets import  QMainWindow
import cv2
from .form.mainwindow import Ui_MainWindow
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import qdarkstyle
import json
import time
class MainWinddow(QMainWindow):
    print_debug_signal = pyqtSignal(str) # 用于触发打印调试信息函数
    show_image_signal = pyqtSignal(str) # 用于触发图像处理结果函数
    # 初始化函数
    def __init__(self,parent=None):
        super(MainWinddow,self).__init__(parent)
        self.main_ui = Ui_MainWindow()
        self.main_ui.setupUi(self)
        # 设置软件名称
        self.setWindowTitle("基于TWINLITENET算法的车道线与可行驶区域感知系统")
        # 设置登录界面第一行,第二行文字
        self.main_ui.label_up.setText("基于TWINLITENET算法的")
        self.main_ui.label_down.setText("车道线与可行驶区域感知系统")
        self.main_ui.label_up_2.setText("基于TWINLITENET算法的")
        self.main_ui.label_9.setText("车道线与可行驶区域感知系统")
        # 设置界面起始页
        self.main_ui.stackedWidget.setCurrentIndex(0)

        # # 设置界面初始状态
        # self.clear_label()
        # # 设置背景颜色
        # palette = qdarkstyle.palette.Palette()
        # palette.ID = "dark"
        # # 修改背景颜色为红色
        # palette.background = "#FF0000"  # 这里是十六进制颜色代码,代表红色
        #
        # self.setStyleSheet(qdarkstyle.load_stylesheet(qt_api="pyqt5", palette=palette))



        self.main_ui.textBrowser_debug.document().setMaximumBlockCount(10)
        # 读取系统人员名单(采用本地保存格式)
        # 账号:英文字母、数字组合或中文(最大长度10)
        # 密码:英文字母、数字组合(最大长度6)
        self.count_dict = {}
        with open(r"UI\form\namelist.json","r", encoding='utf-8'  ) as f:
            self.count_dict = json.load(f)
        # 深度学习模型推理类
        self.videoprocess = videoprocess(self.print_debug_signal,self.show_image_signal)

        # 背景图平铺

    def paintEvent(self, event):
        painter = QPainter(self)
        pixmap = QPixmap("background/background5.jpg")
        painter.drawPixmap(self.rect(), pixmap)

    # 背景图平铺结束

    # 登录槽函数
    def login_function(self):
        # 获取界面账户、密码
        count = self.main_ui.lineEdit_count.text()
        secret = self.main_ui.lineEdit_secret.text()
        # 判断用户信息是否存在
        if count in self.count_dict.keys():
            # 判断密码是否正确
            if self.count_dict[count] == secret:
                # 弹出登录成功窗口
                QMessageBox.information(self,"Tip","登录成功!")
                # 切换页面
                self.main_ui.stackedWidget.setCurrentIndex(2)
            else:
                # 弹出密码错误窗口
                QMessageBox.critical(self,"error","密码错误!")
        else:
            # 弹出账户未注册窗口
            QMessageBox.critical(self,"error","账户未注册!")

    def registe_interface_change(self):
        # 切换页面
        self.main_ui.stackedWidget.setCurrentIndex(1)
        print("registe_interface_change")

    # 注册槽函数
    def registe_function(self):

        # 获取界面账户、密码
        count = self.main_ui.lineEdit_count_2.text()
        secret = self.main_ui.lineEdit_secret_2.text()

        # 判断账户、密码输入是否为空字符串
        if len(count) == 0 or len(secret) == 0:
            # 提示用户重新输入
            QMessageBox.warning(self,"warning","信息无效!")
        else:
            # 忽视用户信息是否存在,重新设置用户信息
            self.count_dict[count] = secret
            # 保存至本地,(如需删除账户信息可直接在UI\form\namelist.json中删除即可)
            with open(r"UI\form\namelist.json","w", encoding='utf-8') as f: ## 设置'utf-8'编码
                f.write(json.dumps(self.count_dict, ensure_ascii=False ,indent=4))  
            QMessageBox.information(self,"Tip","注册成功!")

    def backLoginWindow(self):
        # 切换页面
        self.main_ui.stackedWidget.setCurrentIndex(0)

    # 视频源改变槽函数
    def videosoure_change(self):
        #当视频源发生切换如果视频正在推理需要停止
        if not self.videoprocess.stopped:
            self.videoprocess.stopped = True
            self.clear_label()
        if self.main_ui.comboBox_source.currentIndex() == 0:
            self.main_ui.lineEdit_filepath.setVisible(True)
            self.main_ui.pushButton_open.setVisible(True)

        elif self.main_ui.comboBox_source.currentIndex() == 1:
            self.main_ui.lineEdit_filepath.setVisible(True)
            self.main_ui.pushButton_open.setVisible(True)
    # 打开视频与图片槽函数
    def open_video_function(self):
        # 打开本地路径
        if self.main_ui.comboBox_source.currentIndex() == 0:
            fileName, filetype = QFileDialog.getOpenFileName(self,"选取视频","./videos", "'Video Files (*.mp4 *.avi *.mkv)'") 
        elif self.main_ui.comboBox_source.currentIndex() == 1:
            fileName, filetype = QFileDialog.getOpenFileName(self, '选择图片',"./images", 'Image Files (*.png *.jpg *.jpeg *.gif)')
        # 显示本地路径
        self.main_ui.lineEdit_filepath.setText(fileName)
        # 打印信息
        self.print_debug_signal.emit("{}打开成功,请点击开始按钮!!!".format(fileName))

    # 开始测试
    def predicte_function(self):
        if not self.videoprocess.stopped:
            self.print_debug_signal.emit("已经开启,请关闭后再次开启!!")  
            return
        self.main_ui.pushButton_pause.setVisible(True)
        self.main_ui.pushButton_pause.setText("暂停测试")
        # 是否保存视频
        if self.main_ui.checkBox_save.isChecked():
            self.videoprocess.save_out = True
        else:
            self.videoprocess.save_out = False
        self.videoprocess.filename = self.main_ui.lineEdit_filepath.text()
        # 启动深度学习推理线程
        self.videoprocess.start()
        self.main_ui.pushButton_alarm.setStyleSheet("background-color:rgb(0,255,0);border-radius: 10px; border: 2px groove black;border-style: outset;")
            
    # 暂停测试
    def setpause_function(self):
        if self.videoprocess.is_pause:
            # 当前状态已经暂定
            self.videoprocess.is_pause = False
            self.main_ui.pushButton_pause.setText("暂停测试")
        else:
            self.videoprocess.is_pause = True
            self.main_ui.pushButton_pause.setText("继续测试")
    # 停止测试
    def stop_function(self):
        # 停止深度学习推理线程
        if self.videoprocess.stopped:
            self.print_debug_signal.emit("已经关闭!!")
        else:  
            self.videoprocess.stopped = True
            self.clear_label()
    # 清空标签,恢复初始状态
    def clear_label(self):
        self.main_ui.label_image_source.clear()
        self.main_ui.label_image_source.setText("原视频")
        self.main_ui.label_image_lane.clear()
        self.main_ui.label_image_lane.setText("车道线")
        self.main_ui.label_image_driving.clear()
        self.main_ui.label_image_driving.setText("可行驶区域")
        self.main_ui.label_image_result.clear()
        self.main_ui.label_image_result.setText("识别结果")
        self.main_ui.pushButton_alarm.setStyleSheet("background-color:rgb(150, 150, 150);border-radius: 10px; border: 2px groove black;border-style: outset;")
        self.main_ui.label_fps.setText("FPS: 00.00")
        self.main_ui.pushButton_pause.setVisible(False) # 停止运行后暂停按钮失效

    # 显示界面函数

    def showimgae(self,fps):
        if not self.videoprocess.stopped:
            # 转换格式
            img_source = cv2.cvtColor(self.videoprocess.img_source, cv2.COLOR_BGR2RGB)
            color_lane = cv2.cvtColor(self.videoprocess.color_lane, cv2.COLOR_BGR2RGB)
            color_driving = cv2.cvtColor(self.videoprocess.color_driving, cv2.COLOR_BGR2RGB)
            img_rs = cv2.cvtColor(self.videoprocess.img_rs, cv2.COLOR_BGR2RGB)

            # 显示原图 
            self.main_ui.label_image_source.setPixmap(QPixmap(QImage(img_source.data,img_source.shape[1],img_source.shape[0],QImage.Format_RGB888)))
            self.main_ui.label_image_source.setScaledContents(True)

            # 显示车道线
            self.main_ui.label_image_lane.setPixmap(QPixmap(QImage(color_lane.data,color_lane.shape[1],color_lane.shape[0],QImage.Format_RGB888)))
            self.main_ui.label_image_lane.setScaledContents(True)

           
运行结果

三、在线协助:

如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!

1)远程安装运行环境,代码调试
2)Visual Studio, Qt, C++, Python编程语言入门指导
3)界面美化
4)软件制作
5)云服务器申请
6)网站制作

当前文章连接:https://blog.csdn.net/alicema1111/article/details/132666851
个人博客主页:https://blog.csdn.net/alicema1111?type=blog
博主所有文章点这里:https://blog.csdn.net/alicema1111?type=blog

博主推荐:
Python人脸识别考勤打卡系统:
https://blog.csdn.net/alicema1111/article/details/133434445
Python果树水果识别:https://blog.csdn.net/alicema1111/article/details/130862842
Python+Yolov8+Deepsort入口人流量统计:https://blog.csdn.net/alicema1111/article/details/130454430
Python+Qt人脸识别门禁管理系统:https://blog.csdn.net/alicema1111/article/details/130353433
Python+Qt指纹录入识别考勤系统:https://blog.csdn.net/alicema1111/article/details/129338432
Python Yolov5火焰烟雾识别源码分享:https://blog.csdn.net/alicema1111/article/details/128420453
Python+Yolov8路面桥梁墙体裂缝识别:https://blog.csdn.net/alicema1111/article/details/133434445
Python+Yolov5道路障碍物识别:https://blog.csdn.net/alicema1111/article/details/129589741
Python+Yolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别:https://blog.csdn.net/alicema1111/article/details/129272048

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/555566.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot + 事务钩子函数,打造高效支付系统!

今天,我继续安利一个独门绝技:Spring 事务的钩子函数。 单纯的讲技术可能比较枯燥乏味。 接下来,我将以一个实际的案例来描述Spring事务钩子函数的正确使用姿势。 一、案例背景 拿支付系统相关的业务来举例。在支付系统中,我们…

Nodejs 第六十四章(SSO单点登录)

单点登录 单点登录(Single Sign-On,简称SSO)是一种身份认证和访问控制的机制,允许用户使用一组凭据(如用户名和密码)登录到多个应用程序或系统,而无需为每个应用程序单独提供凭据 SSO的主要优…

openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置

文章目录 openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置266.1 查看当前数据盘的文件系统类型266.2 对于需要修改的磁盘,备份所需的数据至其他磁盘或其他服务器266.3 格式化磁盘为xfs文件系统266.4 执行**步骤一** openGauss学习笔记-…

【Keil MDK5新建工程】STM32F103C8T6

一、参数及片上外设 二、系统结构及引脚定义 三、工程架构及新建工程步骤 四、GPIO模式 一、参数及片上外设 二、系统结构及引脚定义 三、工程架构及新建工程步骤 建立工程文件夹,Keil中新建工程,选择型号 工程文件夹里建立Core、Library、User等文件夹…

2024年华中杯数学建模竞赛ABC题思路分析

简单分析一下各个题目可能需要用到的方法和模型,完整代码和成品论文见文末 A题 太阳能路灯光伏板的朝向设计问题: 1. 球面几何、天文学相关知识,如赤纬角、太阳高度角、时角等概念和公式 2. 太阳辐射模型,根据太阳能辐射强度、大气衰减系数等计算地表太阳辐射强度…

绝对隔离+底层限制,成就猎鹰蜜罐“牢不可破”的立体化安全

前言 自网络诞生以来,攻击威胁事件层出不穷,网络攻防对抗已成为信息时代背景下的无硝烟战争。然而,传统的网络防御技术如防火墙、入侵检测技术等都是一种敌暗我明的被动防御,难以有效应对攻击者随时随地发起的无处不在的攻击和威胁…

【学习笔记】Vue3源码解析:第五部分 - 实现渲染(1)

课程地址:【已完结】全网最详细Vue3源码解析!(一行行带你手写Vue3源码) 第五部分-:(对应课程的第29-32节) 第29节:《实现渲染的createRender方法》 1、通过createApp()方法得到一个…

AI热潮下,公链基础设施赛道都有哪些变化?

最近在一级市场,最火热的赛道无疑是AI,其次是BTC,每天聊的项目80%都集中在这两个赛道,我个人最多的时候一天可以聊5,6个AI项目。 可以预见的是AI泡沫会在明后年达到顶峰,随着数以百计的AI新项目上线&#…

QT实现客户端断开连接

Widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket(this)) {ui->setupUi(this);//初始化界面ui->msgEdit->setEnabled(false); //不可用ui-…

SQL Server Management Studio 显示行号

前言 在使用 SQL Server Management Studio (SSMS) 进行数据库管理和查询时,能够看到代码的行号是非常有用的。这可以帮助您更容易地定位代码错误、讨论特定的代码行,或者在执行长查询时快速找到特定行。在本文中,我将向您展示如何在 SSMS 中…

AIDE:自动驾驶目标检测的自动数据引擎

AIDE:自动驾驶目标检测的自动数据引擎 摘要IntroductionRelated WorksMethodData FeederModel Updater4 Experiments 摘要 自动驾驶车辆(AV)系统依赖于健壮的感知模型作为安全保证的基石。然而,道路上遇到的物体表现出长尾分布&a…

图像生成模型浅析(Stable Diffusion、DALL-E、Imagen)

目录 前言1. 速览图像生成模型1.1 VAE1.2 Flow-based Model1.3 Diffusion Model1.4 GAN1.5 对比速览 2. Diffusion Model3. Stable Diffusion3.1 Text Encoder3.2 Decoder3.3 Generation Model 总结参考 前言 简单学习下图像生成模型的相关知识🤗 以下内容来自于李宏…

vue3+elment复杂详情页面打开后,再打开其他页面都显示空白,控制台也没什么特殊报错

页面使用了el-tabs 、 el-tab-pane、el-table 等标签 但是经测试不是这些问题导致的 js也使用了onMounted ,但是除掉也时空白页面 反正之前人写的页面可乱,尤其是js这块,穿插引用import一大堆 主题页面样式布局如下 最后看到页面代码太乱…

古籍数字化平台:精校功能介绍

一、平台介绍 古籍数字化平台,本着公益性、低成本、合作共赢的三大原则,功能涵盖古籍OCR识别、族谱县志OCR识别、民国报纸OCR识别、图文逐字校对、数据著录、智能标点分段、精编排版、智能白话译文等,是一站式线上整理全流程平台。 平台集成…

备战面试K8S

备战面试&&K8S Kubernetes关于DockerDocker的优缺点分析 WebAssemblyWebAssembly与Container比较 CtrCrictlCtr和CriCtl的区别 Pod生命周期PodConditions容器状态Pod容器组成生命周期的流程 Kubelet EFK日志采集工具的优缺点 Kubernetes 容器运行接口 Container Runti…

2024年免费云服务器推荐,小编亲测好用!

随着云计算技术的飞速发展,云服务器以其弹性、高效、安全的特性,成为众多企业和个人用户的首选。尽管市面上有众多收费的云服务器产品,但免费的云服务器仍然吸引着大量用户,尤其是初学者和预算有限的用户。下面,我们就…

从API到Agent:洞悉LangChain工程化设计

作者:范志东 原文:https://mp.weixin.qq.com/s/zGS9N92R6dsc9Jk57pmYSg 本文作者试着从工程角度去理解LangChain的设计和使用。大家可以将此文档作为LangChain的“10分钟快速上手”手册,希望帮助需要的同学实现AI工程的Bootstrap。 我想做一…

[Vision Board创客营]学习片上Flash移植FAL

文章目录 [Vision Board创客营]学习片上Flash移植FAL介绍环境搭建使用组件测试porbeerasewriteread 结语 [Vision Board创客营]学习片上Flash移植FAL 水平较菜,大佬轻喷。😰😰😰 介绍 🚀🚀Vision-Board 开…

安全开发实战(3)--存活探测与端口扫描

目录 安全开发专栏 前言 存活探测 端口扫描 方式一: 1.3.1 One 1.3.2 Two 1.3.3 批量监测 方式二: 1.3.1 One 1.3.2 Two 1.3.3 Three 1.3.4 扫描ip地址,提取出开放端口和协议 ​编辑 1.3.5 批量扫描(最终完成版) 总结 安全开发专栏 安全开发实战​http://t.csd…

MySql数据库从0-1学习-第五天事务和索引

事务 事务 是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。 注意事项,默认事务是自动提交的,也就是说,当执行一条DML语句,MySql会立即隐…