【Android开发AI实战】基于CNN混合YOLOV实现多车牌颜色区分且针对车牌进行矫正识别(含源码)
文章目录
- 引言
- 单层卷积神经网络(Single-layer CNN)
- 📌 单层 CNN 的基本结构
- 📌 单层 CNN 计算流程图像
- 透视变换矫正车牌c++实现
- 🪄关键代码实现:
- 🪄crnn结构图
- 使用jni实现高级Android开发
- 🎉java层如何调用c++层
- 车牌识别效果图
- 参考文章
引言
本文中使用的模型文件说明均采用ncnn模型格式适配安卓手机端以得到最大的运行推理速度可实现CPU加速以及GPU加速加速推理。
- 车牌检测模型:yolov5
- 车牌矫正:透视变换 车牌识别:crnn
- 车牌颜色识别:单层卷积神经网络
单层卷积神经网络(Single-layer CNN)
单层卷积神经网络(Single-layer CNN) 指的是 仅包含一个卷积层 的神经网络。它主要用于简单的图像特征提取任务,如边缘检测或简单的分类任务。
📌 单层 CNN 的基本结构
一个典型的 单层 CNN 由以下部分组成:
- 输入层(Input Layer)
- 例如输入一个
32×32×3的 RGB 图像。
- 例如输入一个
- 单个卷积层(Single Convolutional Layer)
- 例如使用
5×5×3大小的卷积核,共 6 个卷积核,stride=1,padding=0。
- 例如使用
- 激活函数(Activation Function)
- 例如 ReLU(Rectified Linear Unit)增加非线性表达能力。
- 池化层(Pooling Layer)
- 例如
2×2的最大池化(Max Pooling),用于降维。
- 例如
- 全连接层(Fully Connected Layer, FC)
- 将卷积层输出的数据展平(Flatten),输入到全连接层。
- 输出层(Output Layer)
- 例如使用 Softmax 进行分类。
📌 单层 CNN 计算流程图像
假设输入图像是 32×32×3(RGB 图像),使用 5×5×3 的卷积核,共 6 个卷积核,stride = 1,padding = 0。
透视变换矫正车牌c++实现
🪄关键代码实现:
for (size_t i=0; i<objects.size(); i++)
{// letterbox pad to multiple of 32cv::Mat image;BitmapToMatrix(env, bitmap, image);const Object& obj = objects[i];// 计算车牌四个角点相对于车牌区域左上角的坐标float new_x1 = objects[i].p3x - objects[i].x;float new_y1 = objects[i].p3y - objects[i].y;float new_x2 = objects[i].p4x - objects[i].x;float new_y2 = objects[i].p4y - objects[i].y;float new_x3 = objects[i].p2x - objects[i].x;float new_y3 = objects[i].p2y - objects[i].y;float new_x4 = objects[i].p1x - objects[i].x;float new_y4 = objects[i].p1y - objects[i].y;// 定义源图像的四个角点cv::Point2f src_points[4];// 定义目标图像的四个角点cv::Point2f dst_points[4];// 通过Image Watch查看的二维码四个角点坐标src_points[0]=cv::Point2f(new_x1, new_y1);src_points[1]=cv::Point2f(new_x2, new_y2);src_points[2]=cv::Point2f(new_x3, new_y3);src_points[3]=cv::Point2f(new_x4, new_y4);// 期望透视变换后二维码四个角点的坐标dst_points[0]=cv::Point2f(0.0, 0.0);dst_points[1]=cv::Point2f(168.0, 0.0);dst_points[2]=cv::Point2f(0.0, 48.0);dst_points[3]=cv::Point2f(168.0, 48.0);// 计算透视变换矩阵cv::Mat rotation,img_warp;cv::Rect_<float> rect;rect.x = objects[i].x;rect.y = objects[i].y;rect.height = objects[i].h;rect.width = objects[i].w;// 提取车牌区域cv::Mat ROI = image(rect);// 计算透视变换矩阵rotation=getPerspectiveTransform(src_points,dst_points);// 应用透视变换,将车牌区域矫正为指定大小warpPerspective(ROI,ROI,rotation,cv::Size(168, 48));}//具体看我给的源码实现。
- 下面是结构图
🪄crnn结构图

- 还可以参考此链接我写的另外一篇文章也是矫正的有异曲同工之处点击下面
- 三行代码实现文档智能校正
- crnn实现车牌数字识别
使用jni实现高级Android开发
🎉java层如何调用c++层
- 方法命名规则:C++ 层的 JNI 函数名需要遵循特定的命名规则,例如 Java_包名_类名_方法名。
- 数据类型转换:在 Java 和C++ 之间传递数据时,需要进行数据类型的转换,例如 jstring 和 std::string 之间的转换。
- 内存管理:在 JNI编程中,需要注意内存的分配和释放,避免内存泄漏。
- 如果需要更详细的教程请在评论区留言我下次更新就专门针对Android的高级开发进行讲解。
车牌识别效果图

参考文章
- 三行代码实现文档智能校正
- NCNN 官方文档:NCNN 是一个为手机端极致优化的高性能神经网络前向计算框架,本文使用 ncnn 模型格式适配安卓手机端,此文档提供了关于 NCNN 的详细介绍、使用方法和相关技术细节。
- YOLOv5 官方仓库:本文使用 YOLOv5 作为车牌检测模型,该仓库包含了 YOLOv5 的源代码、训练脚本、预训练模型等资源,有助于深入了解 YOLOv5 的原理和使用方式。
- OpenCV 官方文档:在车牌矫正部分使用了 OpenCV 的透视变换函数,此文档详细介绍了 OpenCV 的各种功能和 API,为计算机视觉开发提供了丰富的资源和指导。
- CRNN 相关论文:本文使用 CRNN 进行车牌识别,该论文是 CRNN 的原始论文,详细阐述了 CRNN 的架构和原理,对于理解和应用 CRNN 模型有很大的帮助。
- JNI 官方教程:在实现 Java 层调用 C++ 层代码时使用了 JNI 技术,该教程提供了关于 JNI 的详细规范和使用方法,是学习和使用 JNI 的重要参考资料。
- 通过结合 YOLOv 与 CNN 以及 OpenCV 算法实现了高精度的车牌识别。
如果以上内容有不足欢迎您的指出。
相关文章:
【Android开发AI实战】基于CNN混合YOLOV实现多车牌颜色区分且针对车牌进行矫正识别(含源码)
文章目录 引言单层卷积神经网络(Single-layer CNN)📌 单层 CNN 的基本结构📌 单层 CNN 计算流程图像 透视变换矫正车牌c实现🪄关键代码实现:🪄crnn结构图 使用jni实现高级Android开发dz…...
探索前端框架的未来:Svelte 的崛起
引言 在前端开发的世界里,框架更新换代的速度仿佛光速。从 jQuery 到 Angular,再到如今大热的 React 和 Vue,开发者们不断追逐更轻量、更快、更易于维护的框架。如今,Svelte 正悄然崛起,并引发了关于前端框架未来的热烈…...
【工具篇】深度揭秘 Midjourney:开启 AI 图像创作新时代
家人们,今天咱必须好好唠唠 Midjourney 这个在 AI 图像生成领域超火的工具!现在 AI 技术发展得那叫一个快,各种工具层出不穷,Midjourney 绝对是其中的明星产品。不管你是专业的设计师、插画师,还是像咱这种对艺术创作有点小兴趣的小白,Midjourney 都能给你带来超多惊喜,…...
多光谱成像技术在华为Mate70系列的应用
华为Mate70系列搭载了光谱技术的产物——红枫原色摄像头,这是一款150万像素的多光谱摄像头。 相较于普通摄像头,它具有以下优势: 色彩还原度高:色彩还原准确度提升约 120%,能捕捉更多光谱信息,使拍摄照片色…...
数字人|通过语音和图片来创建高质量的视频
简介 arXiv上的计算机视觉领域论文: AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation AniPortrait:照片级真实感肖像动画的音频驱动合成 核心内容围绕一种新的人像动画合成框架展开。 研究内容 提出 AniPortrait 框架&a…...
Vue通过触发与监听事件进行数据传递: 子组件调用 $emit 方法来将数据传递给父组件。
文章目录 引言I 组件事件事件参数defineEmits 宏声明需要抛出的事件事件校验例子:子组件告诉父组件放大所有博客文章的文字II 【详细说明】 子组件通过触发一个事件,将数据传递给父组件调用内建的 `$emit `方法传入事件名称来触发一个事件子组件通过`this.$emit`来触发一个事…...
LLMs瞬间获得视觉与听觉感知,无需专门训练:Meta的创新——在图像、音频和视频任务上实现最优性能。
引言: 问题: 当前的多模态任务(如图像、视频、音频描述生成、编辑、生成等)通常需要针对特定任务训练专门的模型,而现有的方法在跨模态泛化方面存在局限性,难以适应新任务。此外,多模态嵌入反演…...
ZZNUOJ(C/C++)基础练习1081——1090(详解版)
目录 1081 : n个数求和 (多实例测试) C C 1082 : 敲7(多实例测试) C C 1083 : 数值统计(多实例测试) C C 1084 : 计算两点间的距离(多实例测试) C C 1085 : 求奇数的乘积(多实例测试…...
Springboot实现TLS双向认证
keytool 是 Java 自带的工具,适合与 JKS 密钥库和信任库一起使用。 一、生成自签名CA证书 生成CA密钥对和自签名证书 keytool -genkeypair -alias my-ca -keyalg RSA -keysize 2048 -validity 3650 -keystore ca.jks -storepass changeit -keypass changeit -dname …...
【DeepSeek】私有化本地部署图文(Win+Mac)
目录 一、DeepSeek本地部署【Windows】 1、安装Ollama 2、配置环境变量 3、下载模型 4、使用示例 a、直接访问 b、chatbox网页访问 二、DeepSeek本地部署【Mac】 1、安装Ollama 2、配置环境变量 3、下载模型 4、使用示例 5、删除已下载的模型 三、DeepSeek其他 …...
深入了解 MySQL:从基础到高级特性
引言 在当今数字化时代,数据的存储和管理至关重要。MySQL 作为一款广泛使用的开源关系型数据库管理系统(RDBMS),凭借其高性能、可靠性和易用性,成为众多开发者和企业的首选。本文将详细介绍 MySQL 的基础概念、安装启…...
SQL精度丢失:CAST(ce.fund / 100 AS DECIMAL(10, 2)) 得到 99999999.99
当你使用 CAST(ce.fund / 100 AS DECIMAL(10, 2)) 进行计算并转换时得到 99999999.99 这个结果,可能由以下几种原因导致: 1. DECIMAL 类型精度限制 DECIMAL(10, 2) 表示总共可以存储 10 位数字,其中小数部分占 2 位。这意味着整数部分最多只…...
深度学习里面的而优化函数 Adam,SGD,动量法,AdaGrad 等 | PyTorch 深度学习实战
前一篇文章,使用线性回归模型逼近目标模型 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课:引领人工智能新时代【梗直哥瞿炜】 深度学习里面的而优化函数 …...
基于Spring Boot的图书个性化推荐系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【实战】excel分页写入导出大文件
类 RequestMapping("export")ResponseBodypublic void export(HttpServletResponse response) {long start System.currentTimeMillis();QueryVo query new QueryVo();// response响应头setResponseHeader(response, "excel");ExcelWriter writer Excel…...
【论文阅读】Comment on the Security of “VOSA“
Comment on the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的…...
3.攻防世界 Confusion1(服务器模板注入SSTI)
题目描述如下 进入题目页面如下 图片是蟒蛇、大象?python、php? 猜测需要代码审计 点击 F12查看源码,有所提示flag 但是也没有其他信息了 猜测本题存在SSTI(服务器模板注入)漏洞,为验证,构造…...
保姆级教程 !SQL Server数据库的备份和还原
使用 SQL Server Management Studio (SSMS) 备份和还原数据库 1、数据库备份 Step 1 打开 SSMS 输入server name 以及用户名和密码连接到你的 SQL Server 实例 Step 2 展开Database,选中你要备份的数据库 Step 3 右击选中的数据库,点击Tasks --> Back …...
AlwaysOn 可用性组副本所在服务器以及该副本上数据库的各项状态信息
目录标题 AlwaysOn语句代码解释:1. sys.dm_hadr_database_replica_states 视图字段详细解释及官网链接官网链接字段解释 2. sys.availability_replicas 视图字段详细解释及官网链接官网链接字段解释 查看视图的创建语句方法一:使用 SQL Server Managemen…...
Android telephony | supl PDN建立和定位信息获取
在Android系统中,SUPL(Secure User Plane Location)是一种用于辅助GPS定位的技术,它通过建立特定的APN(Access Point Name)连接来传输定位数据。 以下介绍Android Telephony发起SUPL APN的PDN(P…...
ip地址是手机号地址还是手机地址
在数字化生活的浪潮中,IP地址、手机号和手机地址这三个概念如影随形,它们各自承载着网络世界的独特功能,却又因名称和功能的相似性而时常被混淆。尤其是“IP地址”这一术语,经常被错误地与手机号地址或手机地址划上等号。本文旨在…...
【react】react面试题
react面试题 1.对 React 的理解、特性 2.react18有哪些更新 3.JSX是什么 4.解释为什么浏览器不能读取jsx 6.ReactNative中,如何解决8081端口被占用而提示无法访问的问题? 7. React 生命周期 8.react事件机制 9.react 组件传值 10.React改…...
zephyr devicetree
Syntax and structure — Zephyr Project Documentation Input files There are four types of devicetree input files: sources (.dts) includes (.dtsi) overlays (.overlay) bindings (.yaml) The devicetree files inside the zephyr directory look like this: …...
学习笔记:机器学习中的数学原理(一)
1. 集合 集合分为有限集和无限集; 对于有限集,两集合元素数相等即为等势; 对于无限集,两集合元素存在一一映射关系即为等势; 无限集根据是否与正整数集等势分为可数集和不可数集。 2. sigmoid函数(也叫…...
鼠标滚轮冒泡事件@wheel.stop
我有一个页面,是在画布上的组件,但是组件中有一个table,table中数据多了,就会出现滚动条,正常情况下,滚动条用鼠标滚轮就可以滑动,但是这个table是在画布上,滚动滚轮会让画布缩放 在table外层的div上加上 wheel.stop,就生效了 wheel.stop 用途:这个修饰符用于处理鼠…...
Unity DoTween使用文档
DoTween 使用文档 DoTween 是 Unity 中非常流行的动画补间插件。它通过链式调用方式,让开发者可以快速创建平滑、自然的动画效果。本文将介绍 DoTween 的基础用法、缓动曲线原理(包含常见缓动曲线的数学公式与参数说明)、案例演示以及一些常…...
C语言中的共用体(Union):嵌入式开发中的节省内存利器
在进行嵌入式开发时,我们常常会听到这样一句话:“内存就是金钱。” 在嵌入式系统中,内存资源通常是非常稀缺的,尤其是在一些微控制器(如STM32、ESP32等)的开发中,我们需要尽可能地精打细算&…...
Java 线程池:7参数配置、4拒绝策略与执行流程详解
1. 为什么需要线程池? 在 Java 并发编程中,线程的创建和销毁是一项昂贵的操作。频繁地创建和销毁线程会带来较高的系统开销,甚至可能因线程数过多而导致 OOM(OutOfMemoryError) 或 CPU 过载。 线程池(Thre…...
代码随想录算法【Day38】
Day38 322. 零钱兑换 思路 完全背包 代码 class Solution { public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount 1, INT_MAX);dp[0] 0;for (int i 0; i < coins.size(); i) { // 遍历物品for (int j coins[i]; j <…...
c# Lazy<T>单例模式 - 延迟初始化单例实例示例与详解
Lazy 延迟初始化单例实例示例与详解 Lazy<T> 是 C# 中用于延迟初始化的类,它允许你在第一次访问对象时才创建实例,而不是在程序启动时就创建实例。这在单例模式中非常有用,因为它可以避免不必要的资源消耗。 1. Lazy 的基本用法 Laz…...
