Android使用OpenCV 4.5.0实现扑克牌识别(源码分享)

news2024/9/23 23:40:57

一、显示效果展示

二、OpenCV 4.5.0

OpenCV 4.5.0是OpenCV(Open Source Computer Vision Library,开源计算机视觉库)的一个重要更新版本,该版本在多个方面进行了优化和新增了多项功能。

三、ONNX模型

ONNX(Open Neural Network Exchange)模型是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。它允许不同的深度学习框架(如PyTorch、TensorFlow、MXNet等)之间交换和共享模型,使得模型可以在不同平台和工具上进行部署和推理。

四、OpenCV加载onnx模型进行前向推理实现识别扑克牌识别


    //统计预测的结果
    private int[] number_class=new int[54];
    public Bitmap detection(Bitmap bp){
        Canvas can=new Canvas();
        Paint p=new Paint();
        android.graphics.Bitmap.Config bitmapConfig = bp.getConfig();
        bp = bp.copy(bitmapConfig, true);
        can=new Canvas(bp);
        p.setAntiAlias(true);
        //不填充,默认填充
        p.setStyle(Paint.Style.STROKE);
        //设置线条宽度
        p.setStrokeWidth(5);
        //设置颜色
        p.setColor(0xFF33FFFF);
        p.setTextAlign(Paint.Align.LEFT);
        p.setTextSize(50);

        Mat blob = Dnn.blobFromImage(src, IN_SCALE_FACTOR,
                new Size(IN_WIDTH, IN_HEIGHT),
                new Scalar(MEAN_VAL, MEAN_VAL, MEAN_VAL), false);
        net.setInput(blob);
        blob.release();

        //获取输出层的名字
        List<String> outnames=net.getUnconnectedOutLayersNames();
//        Log.i("aa",String.valueOf(outnames));
        //创建输出矩阵集合
        List<Mat> detections = new ArrayList<Mat>();
        net.forward(detections,outnames);
        //获取输出的盒子和置信度
        Mat scores=detections.get(0);
        Mat boxes= detections.get(1);
        scores= scores.reshape(1,3000).colRange(1,55);
        boxes= boxes.reshape(1,3000);
        Size ss=scores.size();
//        Log.i("aa",String.valueOf(scores));
//        Log.i("aa",String.valueOf(boxes));

        List<Rect2d> rect2dList=new ArrayList<>();//box信息
        List<Float> confList=new ArrayList<>();//置信度
        List<Integer> objIndexList=new ArrayList<>();//对象类别索引


        for(int i=0; i<scores.rows();i++){
            Mat one_row=scores.rowRange(i,i+1);
            Core.MinMaxLocResult max_index=Core.minMaxLoc(one_row);
            double max_value=max_index.maxVal;
            Point location=max_index.maxLoc;
            if(max_value>0.4){

                confList.add((float) max_value);
                objIndexList.add((int)location.x);

                Mat box_one=boxes.rowRange(i,i+1);
                float[] aa=new float[4];
                box_one.get(0,0,aa);

                double x1=aa[0];
                double y1=aa[1];
                double x2=aa[2];
                double y2=aa[3];
                rect2dList.add(new Rect2d(x1,y1,x2,y2));

            }

        }

        //去重
        //去重后的索引值
        MatOfInt index=new MatOfInt();
        //转换box的结果集
        MatOfRect2d boxe=new MatOfRect2d(rect2dList.toArray(new Rect2d[0]));
        //转换置信度结果集
        float[] confArr=new float[confList.size()];
        for(int j=0;j<confList.size();j++){
            confArr[j]=confList.get(j);
        }
        MatOfFloat con=new MatOfFloat(confArr);
        //使用nms去重
        Dnn.NMSBoxes(boxe,con,0.4f,0.45f,index);
        if (index.empty()){
            return bp;
        }
        //画框
        int[] ints=index.toArray();

        for(int x:ints){
//            Log.i("aa",String.valueOf(x));

            double[] aa=new double[4];
            boxe.get(x,0,aa);
            //Log.i("aa",String.valueOf(aa[0]));
            //Imgproc.rectangle(src,new Point(aa[0]*src.width(),aa[1]*src.height()-70),new Point(aa[2]*src.width()+200,aa[1]*src.height()),new Scalar(255,255,255),-1);
            //Imgproc.rectangle(src,new Point(aa[0]*src.width(),aa[1]*src.height()),new Point(aa[2]*src.width(),aa[3]*src.height()),new Scalar(255,255,0),10);

            //Imgproc.putText(src,""+classNames[objIndexList.get(x)]+":"+confList.get(x),new Point(aa[0]*src.width(),aa[1]*src.height()),Imgproc.FONT_HERSHEY_SIMPLEX, 3, new Scalar(0, 0, 0));
            //画框
            can.drawRect((float) aa[0]*src.width(),(float) aa[1]*src.height(),(float)aa[2]*src.width(),(float)aa[3]*src.height(),p);
            //绘制填充框
            p.setStyle(Paint.Style.FILL);
            p.setColor(0xFFFFCC00);
            can.drawRect((float) aa[0]*src.width(),(float) aa[1]*src.height()-60,(float)aa[2]*src.width()+150,(float)aa[1]*src.height(),p);
            //写字
            p.setColor(0xFFFF0000);
            can.drawText(classNames[objIndexList.get(x)]+": "+String.format("%.3f", confList.get(x)),(float)aa[0]*src.width(),(float) aa[1]*src.height()-10,p);
            p.setStyle(Paint.Style.STROKE);
            p.setColor(0xFF33FFFF);

            //统计类别信息
            number_class[objIndexList.get(x)]+=1;
        }

五、完整源码下载:

Card.zip: https://url83.ctfile.com/f/45573183-1373015108-43a4dd?p=7526 (访问密码: 7526)
 

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

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

相关文章

YOLO V10简单使用

一.环境安装 1、下载官方源码 官方GitHub地址&#xff1a;https://github.com/THU-MIG/yolov10 点击跳转 2. 配置conda环境 在conda创建python3.9环境 conda create -n yolov10 python3.9激活切换到创建的python3.9环境 conda activate yolov103. 安装YOLOv10依赖 切换…

GitHub上图像超分开源项目推荐【持续更新】

RAISR 介绍&#xff1a;RAISR&#xff08;Rapid and Accurate Image Super-Resolution&#xff09;是一种由Google开发的图像超分辨率技术&#xff0c;它利用机器学习算法来提高低分辨率图像的质量&#xff0c;使其看起来更加清晰和细致。这项技术可以在移动设备上实时运行&am…

JBoss EJBInvokerServlet CVE-2013-4810 反序列化漏洞

环境 vulhub/jboss/JMXInvokerServlet-deserialization 复现 此漏洞存在于JBoss中 /invoker/JMXInvokerServlet 路径。访问若提示下载 JMXInvokerServlet&#xff0c;则可能存在漏洞&#xff1a; 1.访问123.57.211.129:8081/invoker/JMXInvokerServlet 使⽤JavaDeserH2HC进…

聊聊通过「白包账号」能否提高谷歌上架成功率?

大家好&#xff0c;我是牢鹅&#xff01;按国际惯例先吐槽下谷歌&#xff0c;近一年来对谷歌开发者来说很难&#xff0c;一方面谷歌政策严厉打击&#xff1b;另一方面审查机制不够健全&#xff0c;过分依赖大模型驱动审核&#xff0c;改善他们所谓的执行力。与苹果相比&#xf…

Easy Excel从入门到精通!!!

目录 1.文件导入 1.1基本方式读取excel文件内容 1.2注解模型映射器读取excel 1.3多行表头读取 1.4文件上传读取 2.文件导出 2.1基本方式导出 2.2模型映射导出 2.3设置行高、列宽等内容 2.4合并单元格 2.5导出设置超链接、批注、公式 2.6模板填充对象导出 2.7模板填…

AI大模型日报#0923:李飞飞创业之后首个专访、华为云+腾讯音乐发布昇腾适配方案

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;、“智谱AI”&#xff08;glm-4-0520&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅…

2024个人简历模板免费可编辑,可能是整理最全的简历(支持Word格式下载)

提供各行业简历模板WORD可编辑格式下载&#xff0c;涵盖求职简历模板、大学生简历模板、个人简历模板、留学简历模板、英文简历模板、免费简历模板、工作简历模板、保研简历模板、暑期实习简历、寒假实习简历、校招简历等。 都是word格式&#xff0c;直接下载就能用。 网盘链…

【重磅】考虑火电机组储热改造的电力系统低碳经济调度

目录 1 主要内容 储热改造原理 约束条件 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑火电机组储热改造的电力系统低碳经济调度》&#xff0c;利用原文献火电机组储热改造方案建立模型&#xff0c;在传统火电机组的基础上加装热能存储系统&#xf…

BEV学习--Nuscenes数据集解读

一、Nuscenes数据集简介 Nuscenes数据的采集来自不同城市的1000个场景中&#xff0c;采集车上配备了完善的传感器&#xff0c;包括6个相机&#xff08;CAM&#xff09;、1个激光雷达&#xff08;LIDAR&#xff09;、5个毫米波雷达&#xff08;RADAR&#xff09;、IMU和GPS&…

【RabbitMQ】RabbitMQ 的概念以及使用RabbitMQ编写生产者消费者代码

目录 1. RabbitMQ 核心概念 1.1生产者和消费者 1.2 Connection和Channel 1.3 Virtual host 1.4 Queue 1.5 Exchange 1.6 RabbitMO工作流程 2. AMQP 3.RabbitMO快速入门 3.1.引入依赖 3.2.编写生产者代码 ​3.3.编写消费者代码 4.源码 1. RabbitMQ 核心概念 在安装…

Java中的事件(动作监听-ActionListener)

&#xff08;一&#xff09;、ActionListener接口 ActionListener接口用于处理用户界面上的动作事件&#xff0c;例如&#xff1a;按钮点击、菜单选择等。实现ActionListener接口需要重写actionPerformed(ActionEvent e)方法&#xff0c;该方法会在动作发生时被调用。 &#…

苍穹外卖上半部分总结

苍穹外卖一个很经典的项目 虽然已经烂大街&#xff0c;但项目依旧是很优秀&#xff0c;并且代码十分规范&#xff0c;很值得学习。 前置介绍 niginx反向代理 前端和后端的url请求不一致的原因&#xff1a;前端是请求到nginx服务器&#xff0c;再由nginx服务器转发到后端 ngi…

个人防护装备检测系统源码分享

个人防护装备检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

字母与符号检测系统源码分享

字母与符号检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

全国职业院校技能大赛(大数据赛项)-平台搭建Spark、Scala笔记

Spark作为一个开源的分布式计算框架拥有高效的数据处理能力、丰富的生态系统、多语言支持以及广泛的行业应用。Scala是一种静态类型的编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性&#xff0c;被誉为通用的“大数据语言”。而二者的结合更能迸发出新奇的化学反…

深度学习之微积分预备知识点(2)

极限&#xff08;Limit&#xff09; 定义&#xff1a;表示某一点处函数趋近于某一特定值的过程&#xff0c;一般记为 极限是一种变化状态的描述&#xff0c;核心思想是无限靠近而永远不能到达 公式&#xff1a; 表示 x 趋向 a 时 f(x) 的极限。 知识点口诀解释极限的存在左…

itextsharp报错 PdfReader not opened with owner password

itextsharp报错 PdfReader not opened with owner password itextsharp读取PDF时报错&#xff1a; PdfReader not opened with owner password 报错原因(据说是)&#xff1a;pdf 文件设置了加密。 网上搜索了一下&#xff0c;查到大多数答案是&#xff1a; 在创建pdfReader…

JDK7u21 HashMap版

今天在搞ROME HotSwappableTargetSource链的时候突然发现&#xff0c;JDK7U21反序列化链不仅HashMap.put触发了key.equals putForCreate也调用了 而且HashMap.readObject直接调用了putForCreate来还原 what?直接向HashMap两个put不就完了&#xff0c;还搞什么HashSet 开弄&am…

闪回科技再冲刺上市:曾夸大融资规模,毛利率下滑,有股东退出

近日&#xff0c;闪回科技有限公司&#xff08;下称“闪回科技”&#xff09;递交招股书&#xff0c;准备在港交所主板上市。据贝多财经了解&#xff0c;该公司曾于2024年2月递表&#xff0c;此次是“失效”后的更新版本&#xff0c;清科资本为其独家保荐人。 闪回科技在招股书…

5款好用的电脑软件,个个良心实用

分享5款好用但冷门的windows软件&#xff0c;个个良心实用&#xff0c;而且大部分免费&#xff0c;值得统统装进电脑里&#xff01; 1、EagleGet——高速下载器 一款免费的高速下载软件&#xff0c;页面设计简洁&#xff0c;没有广告&#xff0c;支持 HTTP、HTTPS、FTP、MMS、…