【Android开发AI实战】基于CNN混合YOLOV实现多车牌颜色区分且针对车牌进行矫正识别(含源码)

news2025/2/9 3:48:22

文章目录

  • 引言
  • 单层卷积神经网络(Single-layer CNN)
    • 📌 单层 CNN 的基本结构
    • 📌 单层 CNN 计算流程图像
  • 透视变换矫正车牌c++实现
    • 🪄关键代码实现:
    • 🪄crnn结构图
  • 使用jni实现高级Android开发
    • 🎉java层如何调用c++层
  • 车牌识别效果图
  • 参考文章

引言

本文中使用的模型文件说明均采用ncnn模型格式适配安卓手机端以得到最大的运行推理速度可实现CPU加速以及GPU加速加速推理。

  1. 车牌检测模型:yolov5
  2. 车牌矫正:透视变换 车牌识别:crnn
  3. 车牌颜色识别:单层卷积神经网络

单层卷积神经网络(Single-layer CNN)

单层卷积神经网络(Single-layer CNN) 指的是 仅包含一个卷积层 的神经网络。它主要用于简单的图像特征提取任务,如边缘检测或简单的分类任务。


📌 单层 CNN 的基本结构

一个典型的 单层 CNN 由以下部分组成:

  1. 输入层(Input Layer)
    • 例如输入一个 32×32×3 的 RGB 图像。

  1. 单个卷积层(Single Convolutional Layer)
    • 例如使用 5×5×3 大小的卷积核,共 6 个卷积核,stride=1,padding=0。

  1. 激活函数(Activation Function)
    • 例如 ReLU(Rectified Linear Unit)增加非线性表达能力。

  1. 池化层(Pooling Layer)
    • 例如 2×2 的最大池化(Max Pooling),用于降维。

  1. 全连接层(Fully Connected Layer, FC)
    • 将卷积层输出的数据展平(Flatten),输入到全连接层。

  1. 输出层(Output Layer)
    • 例如使用 Softmax 进行分类。

📌 单层 CNN 计算流程图像

假设输入图像是 32×32×3(RGB 图像),使用 5×5×3 的卷积核,共 6 个卷积核,stride = 1,padding = 0。

卷积运算 5x5
ReLU 激活
最大池化 2x2
展平
全连接
Softmax
输入层: 32x32x3
卷积层: 28x28x6
激活层: 28x28x6
池化层: 14x14x6
展平层: 1176
全连接层
输出层: 分类

透视变换矫正车牌c++实现

🪄关键代码实现:

for (size_t i=0; i<objects.size(); i++)
{
    // letterbox pad to multiple of 32
    cv::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 算法实现了高精度的车牌识别。
    如果以上内容有不足欢迎您的指出。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多光谱成像技术在华为Mate70系列的应用

华为Mate70系列搭载了光谱技术的产物——红枫原色摄像头&#xff0c;这是一款150万像素的多光谱摄像头。 相较于普通摄像头&#xff0c;它具有以下优势&#xff1a; 色彩还原度高&#xff1a;色彩还原准确度提升约 120%&#xff0c;能捕捉更多光谱信息&#xff0c;使拍摄照片色…

数字人|通过语音和图片来创建高质量的视频

简介 arXiv上的计算机视觉领域论文&#xff1a; AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation AniPortrait&#xff1a;照片级真实感肖像动画的音频驱动合成 核心内容围绕一种新的人像动画合成框架展开。 研究内容 提出 AniPortrait 框架&a…

LLMs瞬间获得视觉与听觉感知,无需专门训练:Meta的创新——在图像、音频和视频任务上实现最优性能。

引言&#xff1a; 问题&#xff1a; 当前的多模态任务&#xff08;如图像、视频、音频描述生成、编辑、生成等&#xff09;通常需要针对特定任务训练专门的模型&#xff0c;而现有的方法在跨模态泛化方面存在局限性&#xff0c;难以适应新任务。此外&#xff0c;多模态嵌入反演…

ZZNUOJ(C/C++)基础练习1081——1090(详解版)

目录 1081 : n个数求和 &#xff08;多实例测试&#xff09; C C 1082 : 敲7&#xff08;多实例测试&#xff09; C C 1083 : 数值统计(多实例测试) C C 1084 : 计算两点间的距离&#xff08;多实例测试&#xff09; C C 1085 : 求奇数的乘积&#xff08;多实例测试…

【DeepSeek】私有化本地部署图文(Win+Mac)

目录 一、DeepSeek本地部署【Windows】 1、安装Ollama 2、配置环境变量 3、下载模型 4、使用示例 a、直接访问 b、chatbox网页访问 二、DeepSeek本地部署【Mac】 1、安装Ollama 2、配置环境变量 3、下载模型 4、使用示例 5、删除已下载的模型 三、DeepSeek其他 …

深度学习里面的而优化函数 Adam,SGD,动量法,AdaGrad 等 | PyTorch 深度学习实战

前一篇文章&#xff0c;使用线性回归模型逼近目标模型 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 深度学习里面的而优化函数 …

基于Spring Boot的图书个性化推荐系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【论文阅读】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)

题目描述如下 进入题目页面如下 图片是蟒蛇、大象&#xff1f;python、php&#xff1f; 猜测需要代码审计 点击 F12查看源码&#xff0c;有所提示flag 但是也没有其他信息了 猜测本题存在SSTI&#xff08;服务器模板注入&#xff09;漏洞&#xff0c;为验证&#xff0c;构造…

保姆级教程 !SQL Server数据库的备份和还原

使用 SQL Server Management Studio (SSMS) 备份和还原数据库 1、数据库备份 Step 1 打开 SSMS 输入server name 以及用户名和密码连接到你的 SQL Server 实例 Step 2 展开Database,选中你要备份的数据库 Step 3 右击选中的数据库&#xff0c;点击Tasks --> Back …

AlwaysOn 可用性组副本所在服务器以及该副本上数据库的各项状态信息

目录标题 AlwaysOn语句代码解释&#xff1a;1. sys.dm_hadr_database_replica_states 视图字段详细解释及官网链接官网链接字段解释 2. sys.availability_replicas 视图字段详细解释及官网链接官网链接字段解释 查看视图的创建语句方法一&#xff1a;使用 SQL Server Managemen…

ip地址是手机号地址还是手机地址

在数字化生活的浪潮中&#xff0c;IP地址、手机号和手机地址这三个概念如影随形&#xff0c;它们各自承载着网络世界的独特功能&#xff0c;却又因名称和功能的相似性而时常被混淆。尤其是“IP地址”这一术语&#xff0c;经常被错误地与手机号地址或手机地址划上等号。本文旨在…

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. 集合 集合分为有限集和无限集&#xff1b; 对于有限集&#xff0c;两集合元素数相等即为等势&#xff1b; 对于无限集&#xff0c;两集合元素存在一一映射关系即为等势&#xff1b; 无限集根据是否与正整数集等势分为可数集和不可数集。 2. sigmoid函数&#xff08;也叫…

鼠标滚轮冒泡事件@wheel.stop

我有一个页面,是在画布上的组件,但是组件中有一个table,table中数据多了,就会出现滚动条,正常情况下,滚动条用鼠标滚轮就可以滑动,但是这个table是在画布上,滚动滚轮会让画布缩放 在table外层的div上加上 wheel.stop,就生效了 wheel.stop 用途&#xff1a;这个修饰符用于处理鼠…

代码随想录算法【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 <…

51单片机之冯·诺依曼结构

一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上&#xff0c;其内部结构如图4-1所示。作为单一芯片的计算机&#xff0c;它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU&#xff0c;由运算器和控制器两个部分构成&#xff1b;…

02.07 TCP服务器与客户端的搭建

一.思维导图 二.使用动态协议包实现服务器与客户端 1. 协议包的结构定义 首先&#xff0c;是协议包的结构定义。在两段代码中&#xff0c;pack_t结构体都被用来表示协议包&#xff1a; typedef struct Pack {int size; // 记录整个协议包的实际大小enum Type type; …

【CubeMX+STM32】SD卡 文件系统读写 FatFs+SDIO+DMA

本篇&#xff0c;将使用CubeMXKeil&#xff0c;创建一个SD卡的 FatFSSDIODMA 文件系统读写工程。 目录 一、简述 二、CubeMX 配置 FatFSSDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、简述 上两篇&#xff0c;已循序渐进讲解了SD、…

51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤

一、Keil uVision5创建工程步骤 1.点击项目&#xff0c;新建 2.新建目录 3.选择目标机器&#xff0c;直接搜索at89c52选择&#xff0c;然后点击OK 4.是否添加起吊文件&#xff0c;一般选择否 5.再新建的项目工程中添加文件 6.选择C文件 7.在C文件中右键&#xff0c;添加…