当前位置: 首页 > news >正文

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)
 

http://www.lryc.cn/news/444521.html

相关文章:

  • Pandas_iloc_loc_哪个是inclusive哪个是exclusive
  • python是什么语言写的
  • python编程,把所有子目录和文件输出到文本文件
  • 使用 IntelliJ IDEA 连接到达梦数据库(DM)
  • 【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘
  • Java中的事件(动作监听-ActionListener)
  • STM32篇:开发环境安装
  • AIGC实战——多模态模型Flamingo
  • 如何在WordPress中添加事件Schema(分步指南)
  • 守护企业资产安全:企业微信群禁止互加好友操作指南!
  • 【QT基础】创建项目项目代码解释
  • 【数据结构】对象的比较
  • 代码随想录八股训练营第四十天| C++
  • 【C++】10道经典面试题带你玩转二叉树
  • 【裸机装机系列】13.kali(ubuntu)-优化-自定义grub启动界面个性化背景
  • 数组高阶应用(C++版)
  • Spring(四)多线程+异步任务执行服务+常见的Enable注解+SpringUnit测试
  • 解析与实现二叉树
  • Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)
  • 操作系统笔记三
  • uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点
  • 基于微信小程序的商品展示+ssm(lw+演示+源码+运行)
  • 【Linux】常用指令(下)(内含more、less、 head、tail、date、find、grep、zip、tar以及学习笔记)
  • DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载
  • Leetcode3289. 数字小镇中的捣蛋鬼
  • 13_Python的高阶函数
  • 清空当前机器所有Docker容器和镜像
  • FreeRTOS学习——Systick中断、SVC中断、PendSV中断
  • 汇量科技大数据面试题及参考答案
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.AVL树