Android使用OpenCV 4.5.0实现扑克牌识别(源码分享)
一、显示效果展示
二、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)
相关文章:

Android使用OpenCV 4.5.0实现扑克牌识别(源码分享)
一、显示效果展示 二、OpenCV 4.5.0 OpenCV 4.5.0是OpenCV(Open Source Computer Vision Library,开源计算机视觉库)的一个重要更新版本,该版本在多个方面进行了优化和新增了多项功能。 三、ONNX模型 ONNX(Open Neu…...

Pandas_iloc_loc_哪个是inclusive哪个是exclusive
iloc 和 loc 包括不包括结尾写的那个行(列)? 不一样! iloc[istart:iend] exclusive on iend 不包括结尾那行(列)! loc[start:end] inclusive on end 包括结尾那行(列)&am…...

python是什么语言写的
Python是一种计算机程序设计语言。是一种面向对象的动态类型语言。现今Python语言很火,可有人提问,这么火的语言它的底层又是什么语言编写的呢? python是C语言编写的,它有很多包也是用C语言写的。 所以说,C语言还是很…...

python编程,把所有子目录和文件输出到文本文件
要将所有子目录和文件输出到文本文件,你可以使用Python的os模块来遍历目录结构,并将结果写入文件。以下是一个简单的Python脚本示例,它会递归地遍历指定目录,并将每个子目录和文件的相对路径写入到一个文本文件中: im…...

使用 IntelliJ IDEA 连接到达梦数据库(DM)
前言 达梦数据库是一款国产的关系型数据库管理系统,因其高性能和稳定性而被广泛应用于政府、金融等多个领域。本文将详细介绍如何在 IntelliJ IDEA 中配置并连接到达梦数据库。 准备工作 获取达梦JDBC驱动: 访问达梦在线服务平台网站或通过其他官方渠道…...

【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

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

STM32篇:开发环境安装
编程语言:C语言 需要安装的软件有两个:Keil5 和 STM32CubeMX 一.Keil5 的安装 使用 Keil4 写 STM32 代码其实也是可以,但需要很复杂的配置,不建议新手操作。 比较推荐 Keil5 编写 STM32 ,只需要一些简单的设置就可…...

AIGC实战——多模态模型Flamingo
AIGC实战——多模态模型Flamingo 0. 前言1. Flamingo 架构2. 视觉编码器3. Perceiver 重采样器4. 语言模型5. FIamingo 应用小结系列链接0. 前言 我们已经学习了文本生成图像模型 DALL.E 2,在本节中,我们将探索另一种多模态模型 Flamingo,它可以根据给定文本和视觉数据流生…...

如何在WordPress中添加事件Schema(分步指南)
如果你正在举办一个在线活动,那么你可能正在寻找通过网络宣传的方法。此时,模式标记可以帮助你在搜索引擎结果中提高活动的可见性。 活动模式将帮助谷歌和其他搜索引擎更好地理解你的活动详情,使它们能够在活动列表、丰富摘要和谷歌知识面板…...

守护企业资产安全:企业微信群禁止互加好友操作指南!
为了防止其他公司的人员混入发起私聊,导致客户资源流失,禁止互加好友十分重要。而软件自带群防骚扰功能,设置好相关规则后,群内成员触发规则会被踢出群聊。 进入工作台-点击更多-选择客户群-选择防骚扰-选择配制企业成员防骚扰规…...

【QT基础】创建项目项目代码解释
目录 前言一,使⽤Qt Creator 新建项目1. 新建项目2. 选择项⽬模板3. 选择项⽬路径4. 选择构建系统5. 填写类信息设置界⾯6. 选择语⾔和翻译⽂件7. 选择Qt套件8. 选择版本控制系统9. 最终效果 二,项目代码说明1. main.cpp文件2. Widget.h文件3. Widget.cp…...

【数据结构】对象的比较
Java数据类型分为基本数据类型和引用类型,基本数据类型可以直接比较大小,对于引用类型的变量不能直接比较。下面来讲解Java对象的比较。 目录 equals比较 Comparble接口类的比较 基于比较器比较 equals比较 equals是Object类中的方法,只能…...

代码随想录八股训练营第四十天| C++
目录 一、什么是菱形继承? 1.1.菱形继承的示例: 1.2.菱形继承的问题: 1.3.解决菱形继承问题: 二、C中的多线程同步机制? 2.1.互斥锁(Mutex): 2.2.递归互斥锁(Recursive Mutex)…...

【C++】10道经典面试题带你玩转二叉树
🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Leetcode/牛客网 目录 一.根据二叉树创建字符串 二.二叉树的层序遍历 三.二叉树的层序遍历 II 四.二叉树的最近公共祖先 五.二叉搜索树与双向链表 六.从前序与中序遍历序列构造二叉树 七.从中序与后序遍历…...

【裸机装机系列】13.kali(ubuntu)-优化-自定义grub启动界面个性化背景
推荐阅读: 1.kali(ubuntu)-为什么弃用ubuntu,而选择基于debian的kali操作系统 当裸机安装了linux之后,开机的时候总会让人误会是黑客,还是优化一下开机界面吧,毕竟是日常开发使用。 注:修改有grub启动项有…...

数组高阶应用(C++版)
在C中,普通的数组(C-style array)、std::initializer_list 、 std::array和std::vector 是四种不同的容器类型,它们各自有不同的特性和用途。下面是对它们进行详细比较和解释。 1. 普通数组(C-style Array)…...

Spring(四)多线程+异步任务执行服务+常见的Enable注解+SpringUnit测试
Spring多线程 Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程ThreadPoolTaskExecutor实现一个基于线程池的TaskExecutor配置类中EnableAsync开启对异步任务的支持使用Async声明该任务为异步 ①、配置类 Configuration ComponentScan(&quo…...

解析与实现二叉树
在数据结构与算法的学习中,二叉树无疑是一个重要且实用的数据结构。它不仅在理论上具有深刻的研究价值,更在实际应用中广泛存在,如搜索引擎的索引结构、文件系统的目录树、数据库的索引、游戏开发中的场景管理等等。本文将深入探讨二叉树的基…...

Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)
文章目录 内部类17.1概述17.2成员内部类17.2.1 获取成员内部类对象17.2.2 成员内部类内存图 17.3静态内部类17.4局部内部类17.5匿名内部类17.5.1概述 内部类 17.1概述 写在一个类里面的类叫内部类,即 在一个类的里面再定义一个类。 如,A类的里面的定义B类&#x…...

操作系统笔记三
进程 把一个静态程序通过OS在内存中让cpu执行起来的动态执行过程叫进程 写代码都是用户态,而进程在执行过程中需要完成特定的功能,这些功能呢只有操作系统能提供,比如说读写文件,读写文件的过程是与硬盘打交道,这个过程…...

uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点
uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点 目录 介绍uniapp 介绍uniapp x 介绍功能框架图创建项目&发布组件/标签的变化js的变化css的变化工程结构和页面管理 pages.jsonmanifest.json 应用配置组件easycom组件规…...

基于微信小程序的商品展示+ssm(lw+演示+源码+运行)
商品展示系统 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,微信小程序被用户普遍使用,为方…...

【Linux】常用指令(下)(内含more、less、 head、tail、date、find、grep、zip、tar以及学习笔记)
文章目录 前言1. more指令2. less指令(重要)3. head指令4. tail指令5. 管道(做到学会使用即可)6. date指令6.1 时间戳 7. cal指令8. find指令9. grep指令10. zip/unzip指令11. tar指令 前言 Linux下的常用指令终于要在本文落下帷…...

DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载
目录 抽象工厂模式 思维导图 接口(抽象类) 工厂接口 抽象产品类 抽象武器接口 抽象人物接口 具体工厂和具体产品 具体工厂 (1)产品接口,生成具体人物 (2)武器接口,生成具体…...

Leetcode3289. 数字小镇中的捣蛋鬼
Every day a Leetcode 题目来源:3289. 数字小镇中的捣蛋鬼 解法1:哈希 代码: /** lc appleetcode.cn id3289 langcpp** [3289] 数字小镇中的捣蛋鬼*/// lc codestart class Solution { public:vector<int> getSneakyNumbers(vector…...

13_Python的高阶函数
高阶函数 高阶函数是Python编程中一个非常强大和有用的特性,它们允许程序员编写更简洁、更抽象的代码。 Python中的高阶函数是那些至少满足以下一个条件的函数: 接受一个或多个函数作为输入(也就是说,它的参数之一是函数&#…...

清空当前机器所有Docker容器和镜像
sudo docker stop $(sudo docker ps -aq) sudo docker rm $(sudo docker ps -aq) sudo docker rmi $(sudo docker images -q)删除当前机器上的所有Docker镜像是一个高风险操作,因为它会删除所有镜像,包括那些可能正在被容器使用的镜像。在执行此操作之前…...

FreeRTOS学习——Systick中断、SVC中断、PendSV中断
FreeRTOS学习——接口宏portmacro.h,仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 port :GCC/ARM_CM7 文章目录 Systick源码触发方式 SVC源码触发方式 PendSV源码触发方式 相关汇编指令 Systick 源码 在Systick中断xPortSysTickHandler中&am…...

汇量科技大数据面试题及参考答案
如何在 SQL 中处理三个字段完全一样的去重?在 Scala 中又该如何实现? 在 SQL 中,可以使用多种方法来处理三个字段完全一样的去重。一种常见的方法是使用 DISTINCT 关键字结合多个字段来实现。例如,假设有表 table_name,包含字段 field1、field2 和 field3,可以使用以下 S…...