C# Yolo+Onnx 号牌识别

news2025/1/10 13:41:40

参考

https://github.com/missxingwu/net_yolov5_plate
https://github.com/ivilson/Yolov7net
https://github.com/we0091234/Chinese_license_plate_detection_recognition

效果

 项目

VS2022+.net 4.8+OpenCvSharp4+Microsoft.ML.OnnxRuntime

 部分代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Onnx_号牌识别
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Yolov5 yolo;
        Yolov5Ocr yoloOcr;

        private void Form1_Load(object sender, EventArgs e)
        {
            yolo = new Yolov5("./assets/plate_detect_v7.onnx", inputName: "input");
            yolo.SetupYoloDefaultLabels();

            yoloOcr = new Yolov5Ocr("./assets/plate_rec_color.onnx", inputName: "images");
            yoloOcr.SetupYoloDefaultLabels();
        }

        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string imgPath = "";

        private void button2_Click(object sender, EventArgs e)
        {
            pictureBox2.Image = null;
            textBox1.Text = "";

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
            pictureBox1.Image = null;
            imgPath = ofd.FileName;
            pictureBox1.Image = new Bitmap(imgPath);

        }

        /// <summary>
        /// 图片拼接
        /// </summary>
        /// <param name="sourceImg">图片1</param>
        /// <param name="newImg">图片2</param>
        /// <returns>拼接后的图片</returns>
        Bitmap JoinImage(Image sourceImg, Image newImg)
        {
            int imgHeight = 0, imgWidth = 0;

            imgWidth = sourceImg.Width + newImg.Width;
            imgHeight = sourceImg.Height > newImg.Height ? sourceImg.Height : newImg.Height;

            Bitmap joinedBitmap = new Bitmap(imgWidth, imgHeight);
            using (Graphics graph = Graphics.FromImage(joinedBitmap))
            {
                graph.DrawImage(sourceImg, 0, 0, sourceImg.Width, sourceImg.Height);
                graph.DrawImage(newImg, sourceImg.Width, 0, newImg.Width, newImg.Height);
            }
            return joinedBitmap;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (imgPath == "")
            {
                return;
            }

            var image = System.Drawing.Image.FromFile(imgPath);
            var predictions = yolo.Predict(image);

            if (predictions.Count < 1) return;

            var graphics = Graphics.FromImage(image);
            int num = 0;
            foreach (var prediction in predictions) // iterate predictions to draw results
            {
                num++;
                double score = Math.Round(prediction.Score, 2);
                var labelRect = prediction.Rectangle;
                var twoLayers = (labelRect.Height / labelRect.Width) > 0.5;
                //定义截取矩形
                System.Drawing.Rectangle cropArea = new System.Drawing.Rectangle((int)labelRect.X < 0 ? 0 : (int)labelRect.X, (int)labelRect.Y < 0 ? 0 : (int)labelRect.Y, (int)labelRect.Width, (int)labelRect.Height);
                //定义Bitmap对象
                System.Drawing.Bitmap bmpImage = new System.Drawing.Bitmap(image);
                //进行裁剪
                System.Drawing.Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);

                if (twoLayers)
                {
                    var img_upper_H = labelRect.Height / 2;
                    var width = (int)labelRect.Width + 1;
                    var height = (int)img_upper_H;
                    Bitmap resultBitmap = new Bitmap(width, height);
                    using (Graphics g = Graphics.FromImage(resultBitmap))
                    {
                        Rectangle resultRectangle = new Rectangle(0, 0, width, height);
                        Rectangle sourceRectangle = new Rectangle(0, 0, width, height);
                        g.DrawImage(bmpCrop, resultRectangle, sourceRectangle, GraphicsUnit.Pixel);
                    }

                    Bitmap resultBitmap1 = new Bitmap(width, height);
                    using (Graphics g = Graphics.FromImage(resultBitmap1))
                    {
                        Rectangle resultRectangle = new Rectangle(0, 0, width, height);
                        Rectangle sourceRectangle = new Rectangle(0, height, width, height);
                        g.DrawImage(bmpCrop, resultRectangle, sourceRectangle, GraphicsUnit.Pixel);
                    }
                    bmpCrop = JoinImage(resultBitmap, resultBitmap1);
                }

                pictureBox2.Image = bmpCrop;

                var backtxt = "";
                var yoloOcrpredictions = yoloOcr.Predict(bmpCrop);
                if (yoloOcrpredictions.Length > 0)
                {
                    backtxt = "车牌颜色:" + yoloOcrpredictions[1] + "\r\n车牌号:" + yoloOcrpredictions[0];
                }

                //graphics.DrawRectangles(new Pen(prediction.Label.Color, 1), new[] { prediction.Rectangle });
                //var (x, y) = (prediction.Rectangle.X, prediction.Rectangle.Y + (labelRect.Height / 2));
                //graphics.DrawString($"{prediction.Label.Name} ({score})({backtxt})",
                //                new Font("Consolas", 14, GraphicsUnit.Pixel), new SolidBrush(Color.Red),
                //                new PointF(0, y));

                textBox1.Text = String.Format("{0}\r\nscore:{1}\r\n{2}", prediction.Label.Name, score, backtxt);

            }

        }

    }
}

Demo下载

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

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

相关文章

xDS解决的是什么样子的痛点

xDS基本概念 Istio发现模型 xDS是什么 xDS是一类发现服务的总称&#xff0c;包含LDS&#xff0c; RDS&#xff0c; CDS&#xff0c; EDS以及SDS。 Envoy通过xDS API可以动态获取Listener&#xff08;监听器&#xff09;&#xff0c;Route&#xff08;路由&#xff09;&#x…

Python 集合 union()函数使用详解,Python合并集合

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 union函数使用详解 1、合并多个集合2、合并其他类型2.1、合并字符串2.2、合并列表…

性能测试Ⅲ

JMeter里面使用后端监听器&#xff0c;结合influxdb的时序数据库以及grafana可以打造性能测试的平台 后端监听器&#xff1a;把JMeter执行过程中的数据写到influxDB的时序数据库 influxD&#xff1a;时序数据库&#xff0c;用来存储JMeter发送请求的数据 Grafana &#xff1a;从…

k8s容器入门

一、k8s入门 1.什么是容器 降低虚拟机造成的物理主机资源浪费&#xff0c;提高物理主机的利用率&#xff0c;并能提供像虚拟机一样狼好的应用程序隔离运行环境&#xff0c;人们把这种轻量型的虚拟机&#xff0c;称为容器。 2. 容器的管理工具 主要用于容器的创建、启动、关…

优化transformer

使用transformer而导致的时间长&#xff0c;可能会由于self-attention计算Query和key的值才导致的时间长&#xff0c;也可能会因为feed forward中的计算导致时间长。这里我们只针对第一种情况下进行优化。 第一种情况&#xff1a;有些问题&#xff0c;我们可能不需要看整个句子…

Linux安装JDK、Redis、MySQL、RabbitMQ、Minio、Nginx.......

文章目录 一、环境准备二、安装JDK三、安装MySQL四、安装Redis三、安装RabbitMQ四、安装Minio五、安装Nginx特殊情况处理Centos7挂载磁盘服务器时间同步MySQL数据库时间同步安装解压软件修改数据库SQL模式 一、环境准备 下载镜像源 中科大镜像源下载至/opt目录下修改yum源为中…

蓝桥杯专题-真题版含答案-【贪吃蛇长度】【油漆面积】【绘制圆】【高次方数的尾数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

微服务初始

今天准备开始学习微服务&#xff0c;使用微服务肯定是因为他有好处。 首先了解到的三种架构&#xff0c;传统单体&#xff0c;集群架构&#xff0c;微服务架构 单体架构 有单点问题&#xff0c;如果宕机所有的服务都不可用所有业务的功能模块都聚集在一起&#xff0c;如果代…

POSTGRESQL PERPARE 事务提交方式,到底用还是不用

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

单Bank OTA升级:STM32G071 APP (二)

接上一篇文章&#xff1a;单Bank OTA升级&#xff1a;STM32G071 BootLoader (一)&#xff1a;跳转链接 什么是单Bank升级&#xff1a;将Flash划分为以下3个区域。 BootLoader区&#xff1a;程序进行升级的引导程序&#xff0c;根据Upade_Flag来判断跳转Bank区运行程序或是接收…

spring复习:(52)注解方式下,ConfigurationClassPostProcessor是怎么被添加到容器的?

进入AnnotationConfigApplicationContext的构造方法&#xff1a; 进入AnnotatedBeanDefinitionReader的构造方法&#xff1a; 进入this(registry, getOrCreateEnvironment(registry));代码如下&#xff1a; 进入AnnotationConfigUtils.registerAnnotationConfigProcessors方…

贤鱼的刷题日常(数据结构栈学习)-1696:波兰表达式--(递归+栈双题解)题目详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解1696:波兰表达式 ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;25分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&#xff0c;欢迎你…

MySQL用户管理详解

文章目录 用户管理创建用户更改密码mysql的权限分类授权实例撤销权力 mysql检查顺序相关文件信息 用户管理 创建用户 在MySQL中&#xff0c;创建用户是管理和授权数据库访问权限的重要操作。下面是创建用户的详细步骤&#xff1a; 连接到MySQL服务器&#xff1a;使用MySQL客户…

人员定位安全管控系统:提升安全管理水平的智能解决方案

在当今社会&#xff0c;人员安全管理成为各行各业关注的焦点。为了保障人员的安全和提高管理效率&#xff0c;人员定位安全管控系统应运而生。 人员定位安全管控系统采用多种定位技术来实现对人员位置的准确定位&#xff0c;如GPS&#xff08;全球定位系统&#xff09;、Wi-Fi…

强化学习论文《Deep Reinforcement Learning that Matters》笔记

文章目录 1. 简介2. 实验分析超参数网络架构Reward ScaleRandom Seeds and TrailsEnvironmentCodebases 3. Reporting Evaluation MetricsOnline view vs. Policy OptimizationConfidence BoundsPower AnalysisSignificance 4. 结论5. 参考资料 1. 简介 这篇2017年的论文 是强化…

【PHP】phpstudy添加的网站,访问出现 嗯… 无法访问此页面

使用phpstudy创建网站&#xff0c;只有localhost可以访问&#xff0c; 其他所有网站无法访问&#xff0c;可能是你的账户没有修改vhost的权限 找到 C:\Windows\System32\drivers\etc下的vhost文件&#xff0c; 1、右键属性 将只读去掉 2、把用户对此文件的控制权限全部勾上 …

解决直播间源码音视频不同步问题的有效方式

随着网络技术的发展和移动设备的普及&#xff0c;电视、电脑、手机等数码产品越来越智能&#xff0c;我们不管是在家或是在外面都可以运用不同的数码产品去看剧或是短视频等&#xff0c;但可能很多人遇到过这样一种情况&#xff1a;当我们在看剧或是短视频的时候&#xff0c;可…

微信小程序可输入弹窗

addWhite() {wx.showModal({title: 添加白名单,editable: true, // 可输入content: ,complete: (res) > {if (res.confirm) {if (!res.content) { // 输入的值wx.showToast({title: 请填写白名单,icon: error})this.addWhite()}else {// 调接口}}}})},

Linux命令-按照与使用(17)(转载)解决同一台服务器上部署多个tomcat的同一个项目session冲突问题...

———————————————— 版权声明&#xff1a;本文为CSDN博主「strive_or_die」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。 原文链接&#xff1a;https://blog.csdn.net/strive_or_die/article/details/103191546…

EXCEL模板如何自定义并使用?

文章目录 0.引言1.新建EXCEL2.EXCEL另存为模板3.使用模板 0.引言 使用Excel模板可以帮助用户更高效地处理和分析大量数据&#xff0c;简化重复任务&#xff0c;并提供清晰直观的数据可视化效果。对于需要频繁进行数据处理和分析的个人或组织来说&#xff0c;使用Excel模板是一个…