基于STM32的车牌识别系统的设计(单片机毕设+原理图+PCB+论文全套)

友善提示

支持JAVA、Python、大数据专业、小程序、PHP、APP、ASP.NET、Node.js、Vue、STM32单片机及51单片机、数据分析、可视化、推荐系统等各类系统定做,您出题目,我们按需求定做。或者我们出相关的选题,并定做系统都支持…

博主简介

作者简介:Java领域优质创作者、优快云博客专家 、优快云内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业讲师以及同行交流合作
主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等
业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路等。
收藏点赞不迷路 关注作者有好处
文末获取源码

系统演示录像

文章底部名片,联系我获取更详细的演示视频

系统实际运行效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目介绍

项目介绍
本设计旨在基于STM32单片机,通过深入研究控制系统的硬件电路设计和相应的软件程序设计,实现一套完整的车牌识别系统。主要研究内容包括主控模块、电源模块、显示模块、摄像头模块、按键模块和驱动模块等硬件模块的设计和整合。该系统不仅能够显示车牌识别结果和停车费用等实时数据,而且通过摄像头模块捕捉车牌图像,实现车辆自动识别。在识别成功后,开始计费,并通过按键操作方便地查看停车车牌和相关费用。通过此研究,旨在建立一套高效、智能的基于STM32的车牌识别系统,为解决停车场管理问题提供可行性解决方案,推动嵌入式系统在智能交通领域的应用,并为未来的智能交通系统发展提供有力支持

功能介绍
基于STM32的车牌识别系统是一个集成了图像采集、处理和显示的智能系统。该系统通过OV7670摄像头采集车牌图像,利用STM32单片机进行图像处理和车牌识别,并通过TFT液晶屏显示识别结果。图像采集模块使用OV7670摄像头采集现场车牌图像。使用STM32单片机负责执行图像预处理、特征提取、车牌定位和字符识别等任务。TFT液晶屏用于显示车牌识别结果和系统信息,提供用户交互界面。OV7670摄像头用于实时采集车辆车牌的图像数据,通过SCCB接口与STM32单片机连接,传输采集到的图像数据。STM32单片机是核心处理单元,负责整个系统的控制逻辑和图像处理算法的执行。执行此功能要求单片机需要有足够的I/O端口连接摄像头和TFT显示屏,以及必要的内存和处理能力来处理图像数据和运行识别算法。TFT液晶屏用于显示识别出的车牌号码以及系统状态信息,该模块通过SPI接口或其他通信接口与STM32单片机连接。在软件设计方面,进行图像采集与预处理时,需要编写驱动程序控制OV7670摄像头,采集车牌图像,实现图像的预处理操作,如灰度化、二值化,以提高后续处理的准确性和效率。在进行车牌定位与识别时,应用图像处理算法实现车牌区域的精确定位,使用字符分割算法将车牌区域分割为单个字符。使用TFT显示模块来进行结果显示,实时显示车牌识别结果和系统状态。

数据库表设计(供参考)

1. 用户表(t_user)

  • 描述: 存储用户的基本信息
  • 字段:
    字段名数据类型主键是否为空描述
    user_idBIGINT用户ID(唯一标识)
    usernameVARCHAR(50)用户名
    passwordVARCHAR(255)密码
    emailVARCHAR(100)邮箱
    phoneVARCHAR(20)电话号码
    statusTINYINT状态(0-禁用,1-启用)
    create_timeDATETIME创建时间
    update_timeDATETIME更新时间

2. 角色表(t_role)

  • 描述: 存储角色信息
  • 字段:
    字段名数据类型主键是否为空描述
    role_idBIGINT角色ID(唯一标识)
    role_nameVARCHAR(50)角色名称
    descriptionVARCHAR(255)角色描述
    create_timeDATETIME创建时间
    update_timeDATETIME更新时间

核心代码展示


/**
 * 商家
 * 后端接口
 * @author
 * @email
*/
@RestController
@Controller
@RequestMapping("/shangjia")
public class ShangjiaController {
    private static final Logger logger = LoggerFactory.getLogger(ShangjiaController.class);

    @Autowired
    private ShangjiaService shangjiaService;


    @Autowired
    private TokenService tokenService;
    @Autowired
    private DictionaryService dictionaryService;

    //级联表service

    @Autowired
    private YonghuService yonghuService;


   
    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody ShangjiaEntity shangjia, HttpServletRequest request){
        logger.debug("update方法:,,Controller:{},,shangjia:{}",this.getClass().getName(),shangjia.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
        //根据字段查询是否有相同数据
        Wrapper<ShangjiaEntity> queryWrapper = new EntityWrapper<ShangjiaEntity>()
            .notIn("id",shangjia.getId())
            .andNew()
            .eq("username", shangjia.getUsername())
            .or()
            .eq("shangjia_phone", shangjia.getShangjiaPhone())
            .andNew()
            .eq("shangjia_delete", 1)
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        ShangjiaEntity shangjiaEntity = shangjiaService.selectOne(queryWrapper);
        if("".equals(shangjia.getShangjiaPhoto()) || "null".equals(shangjia.getShangjiaPhoto())){
                shangjia.setShangjiaPhoto(null);
        }
        if(shangjiaEntity==null){
            shangjiaService.updateById(shangjia);//根据id更新
            return R.ok();
        }else {
            return R.error(511,"账户或者联系方式已经被使用");
        }
    }


    /**
    * 审核
    */
    @RequestMapping("/shenhe")
    public R shenhe(@RequestBody ShangjiaEntity shangjia, HttpServletRequest request){
        logger.debug("shenhe方法:,,Controller:{},,shangjia:{}",this.getClass().getName(),shangjia.toString());

//        if(shangjia.getShangjiaYesnoTypes() == 2){//通过
//            shangjia.setShangjiaTypes();
//        }else if(shangjia.getShangjiaYesnoTypes() == 3){//拒绝
//            shangjia.setShangjiaTypes();
//        }
        shangjia.setShangjiaShenheTime(new Date());//审核时间
        shangjiaService.updateById(shangjia);//审核
        return R.ok();
    }

    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        ArrayList<ShangjiaEntity> list = new ArrayList<>();
        for(Integer id:ids){
            ShangjiaEntity shangjiaEntity = new ShangjiaEntity();
            shangjiaEntity.setId(id);
            shangjiaEntity.setShangjiaDelete(2);
            list.add(shangjiaEntity);
        }
        if(list != null && list.size() >0){
            shangjiaService.updateBatchById(list);
        }
        return R.ok();
    }


   

    /**
    * 登录
    */
    @IgnoreAuth
    @RequestMapping(value = "/login")
    public R login(String username, String password, String captcha, HttpServletRequest request) {
        ShangjiaEntity shangjia = shangjiaService.selectOne(new EntityWrapper<ShangjiaEntity>().eq("username", username));
        if(shangjia==null || !shangjia.getPassword().equals(password))
            return R.error("账号或密码不正确");
        else if(shangjia.getShangjiaDelete() != 1)
            return R.error("账户已被删除");
        else if(shangjia.getShangjiaYesnoTypes() == 1)
            return R.error("请等待审核结果");
        else if(shangjia.getShangjiaYesnoTypes() == 3)
            return R.error("账户审核已被拒绝,有疑问请联系服务人员");
        //  // 获取监听器中的字典表
        String token = tokenService.generateToken(shangjia.getId(),username, "shangjia", "商家");
        R r = R.ok();
        r.put("token", token);
        r.put("role","商家");
        r.put("username",shangjia.getShangjiaName());
        r.put("tableName","shangjia");
        r.put("userId",shangjia.getId());
        return r;
    }

    /**
    * 注册
    */
    @IgnoreAuth
    @PostMapping(value = "/register")
    public R register(@RequestBody ShangjiaEntity shangjia){
//    	ValidatorUtils.validateEntity(user);
        Wrapper<ShangjiaEntity> queryWrapper = new EntityWrapper<ShangjiaEntity>()
            .eq("username", shangjia.getUsername())
            .or()
            .eq("shangjia_phone", shangjia.getShangjiaPhone())
            .andNew()
            .eq("shangjia_delete", 1)
            ;
        ShangjiaEntity shangjiaEntity = shangjiaService.selectOne(queryWrapper);
        if(shangjiaEntity != null)
            return R.error("账户或者联系方式已经被使用");
        shangjia.setShangjiaXingjiTypes(1);
        shangjia.setNewMoney(0.0);
        shangjia.setShangjiaYesnoTypes(1);
        shangjia.setShangjiaDelete(1);
        shangjia.setCreateTime(new Date());
        shangjiaService.insert(shangjia);
        return R.ok();
    }

    /**
     * 重置密码
     */
    @GetMapping(value = "/resetPassword")
    public R resetPassword(Integer  id){
        ShangjiaEntity shangjia = new ShangjiaEntity();
        shangjia.setPassword("123456");
        shangjia.setId(id);
        shangjiaService.updateById(shangjia);
        return R.ok();
    }


    /**
     * 忘记密码
     */
    @IgnoreAuth
    @RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request) {
        ShangjiaEntity shangjia = shangjiaService.selectOne(new EntityWrapper<ShangjiaEntity>().eq("username", username));
        if(shangjia!=null){
            shangjia.setPassword("123456");
            boolean b = shangjiaService.updateById(shangjia);
            if(!b){
               return R.error();
            }
        }else{
           return R.error("账号不存在");
        }
        return R.ok();
    }


    /**
    * 获取用户的session用户信息
    */
    @RequestMapping("/session")
    public R getCurrShangjia(HttpServletRequest request){
        Integer id = (Integer)request.getSession().getAttribute("userId");
        ShangjiaEntity shangjia = shangjiaService.selectById(id);
        if(shangjia !=null){
            //entity转view
            ShangjiaView view = new ShangjiaView();
            BeanUtils.copyProperties( shangjia , view );//把实体数据重构到view中

            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }
    }


    /**
    * 退出
    */
    @GetMapping(value = "logout")
    public R logout(HttpServletRequest request) {
        request.getSession().invalidate();
        return R.ok("退出成功");
    }
}

数据库脚本

CREATE TABLE `yonghu` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `yonghuming` varchar(200) NOT NULL COMMENT '用户名',
  `mima` varchar(200) NOT NULL COMMENT '密码',
  `xingming` varchar(200) DEFAULT NULL COMMENT '姓名',
  `xingbie` varchar(200) DEFAULT NULL COMMENT '性别',
  `touxiang` varchar(200) DEFAULT NULL COMMENT '头像',
  `shouji` varchar(200) DEFAULT NULL COMMENT '手机',
  `shenfenzheng` varchar(200) DEFAULT NULL COMMENT '身份证',
  PRIMARY KEY (`id`),
  UNIQUE KEY `yonghuming` (`yonghuming`)
) ENGINE=InnoDB AUTO_INCREMENT=1616222324596 DEFAULT CHARSET=utf8mb3 COMMENT='用户';
CREATE TABLE `messages` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `userid` bigint NOT NULL COMMENT '留言人id',
  `username` varchar(200) DEFAULT NULL COMMENT '用户名',
  `content` longtext NOT NULL COMMENT '留言内容',
  `reply` longtext COMMENT '回复内容',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1616222424131 DEFAULT CHARSET=utf8mb3 COMMENT='留言板';
CREATE TABLE `token` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `userid` bigint NOT NULL COMMENT '用户id',
  `username` varchar(100) NOT NULL COMMENT '用户名',
  `tablename` varchar(100) DEFAULT NULL COMMENT '表名',
  `role` varchar(100) DEFAULT NULL COMMENT '角色',
  `token` varchar(200) NOT NULL COMMENT '密码',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
  `expiratedtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '过期时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3 COMMENT='token表';

找我做程序,有什么保障?

我本人就是科技工作室负责人,程序大部分由博主亲自带领主导开发完成,页面设计、接口设计多由博主个人为广大需求者定制开发,如果需要其他功能,也可以联系我进行定制开发,找我们做的程序项目,都享有代码讲解服务,会议博主亲自讲解,可以全程录音录屏!这就是我们的保障,团队开发让您更省心省力,得到更大的保障!!!

联系我们

大家点赞、收藏、关注、评论
查看👇🏻文章下方名片联系我即可~👇🏻
精彩专栏推荐订阅:在下方专栏
Python精品毕设案例《500套》
PHP精品毕设案例《500套》
Java精品实战案例《2600套》
微信小程序项目精品案例《500套》
基于大数据、数据分析大屏、爬虫精品毕设案例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值