友善提示
支持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_id BIGINT 是 否 用户ID(唯一标识) username VARCHAR(50) 否 否 用户名 password VARCHAR(255) 否 否 密码 email VARCHAR(100) 否 否 邮箱 phone VARCHAR(20) 否 是 电话号码 status TINYINT 否 否 状态(0-禁用,1-启用) create_time DATETIME 否 否 创建时间 update_time DATETIME 否 否 更新时间
2. 角色表(t_role)
- 描述: 存储角色信息
- 字段:
字段名 数据类型 主键 是否为空 描述 role_id BIGINT 是 否 角色ID(唯一标识) role_name VARCHAR(50) 否 否 角色名称 description VARCHAR(255) 否 是 角色描述 create_time DATETIME 否 否 创建时间 update_time DATETIME 否 否 更新时间
核心代码展示
/**
* 商家
* 后端接口
* @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套》
基于大数据、数据分析大屏、爬虫精品毕设案例
1145

被折叠的 条评论
为什么被折叠?



