安卓基于图像识别和CNN做出一个通用的斗地主记牌器(一)

news/2024/11/17 4:29:09/

先放一个效果图,如下:

 

设计的主体思路:

1.图像的快速截取

2.图像的预处理

3.识别模型的设计和训练

4.图像匹配

5.业务逻辑的实现

其中,图像处理主要是基于安卓版opencv。识别模型是基于cnn神经网络。

难点

1.粘连图像的分割

2.鉴于设计的以通用为目的,所以不同游戏平台的扑克牌长得千差万别,记牌器本身的兼容性成为一个巨大的挑战。

3.去除特效干扰(炸弹的特效,飞机特效等)。

4.性能,在调用图像处理算法,神经网络算法的前提下,需要保证在普通的智能手机上占用很小的性能实现在毫秒级别的识别。

 

一 图像的快速截取

截屏方法有多种。我们的需求是连续,快速,少占资源,非root的截屏方式。目前符合这一条件的是安卓5.0以上版本(毕竟目前都8.0了,5.0以下的就自动忽略啦)提供的API。

​ Android 在5.0 之后支持了实时录屏的功能。通过实时录屏我们可以拿到截屏的图像。同时可以通过在Service中处理实现后台的录屏。

大体步骤:

1.初始化一个MediaProjectionManager。

MediaProjectionManager mMediaProjectionManager = (MediaProjectionManager)getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);

2.创建intent,并启动Intent。注意这里是startActivityForResult

startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);

3.在onActivityResult中拿到Mediaprojection。

4.设置VirtualDisplay 将图像和展示的View关联起来。一般来说我们会将图像展示到SurfaceView,这里为了为了便于拿到截图,我们使用ImageReader,他内置有SurfaceView。

5.通过ImageReader拿到截图

 

strDate = dateFormat.format(new java.util.Date());

nameImage = pathImage+strDate+".png";

Image image = mImageReader.acquireLatestImage();

int width = image.getWidth();

int height = image.getHeight();

final Image.Plane[] planes = image.getPlanes();

final ByteBuffer buffer = planes[0].getBuffer();

int pixelStride = planes[0].getPixelStride();

int rowStride = planes[0].getRowStride();

int rowPadding = rowStride - pixelStride * width;

Bitmap bitmap = Bitmap.createBitmap(width+rowPadding/pixelStride, height, Bitmap.Config.ARGB_8888);

bitmap.copyPixelsFromBuffer(buffer);

bitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height);

image.close();

6.截屏之后关闭VirtualDisplay 。

 

需要注意的一点是,acquireLatestImage,acquireNextImage两个方法如果循环调用的话会占用大量的系统资源,有因为这是一个service而容易被人忽略这一点,所以一定要去做相关的触发控制。具体办法可以根据官网提供的两个函数的特性来设计实现。

二 图像的预处理

各个平台的扑克牌长得都不一样,下面5张是我挑选出来比较有代表性问题的图片。

第一张 干扰多

第二张 扁平严重,图像模糊

第三张 花色和数字轻度粘连

第四张 数字和其他的图形粘连

第五张:特效的动态干扰

 

解决方法:

1.基于扑克牌的红、黑、特性,重新设计灰度化算法,达到加强红黑特征的目的。

2.设计平滑算子,对图片的粘连处进行平滑,达到分割轻度粘连的目的。

3.根据不同阈值(加上形态学处理)形成多张二值化图片

4.轮廓提取并进行合并,过滤。

下面是典型的经过处理后的轮廓图片:

 

至此,我们寻找普通牌轮廓的目的基本达成。我们看看有各种问题的图片表现如何。

 

待续。。。


http://www.ppmy.cn/news/583557.html

相关文章

因果推断阶段系列23[阶段2-5]----元学习器 meta-learners

因果推断阶段系列23[阶段2-5]----元学习器meta-learners 1. S-Learner(又名稳定学习器)2. T-Learner(T学习器)3. X-Learner(X学习器)小结参考文献简要回顾一下,前几节介绍了处理效应异质性,即确定不同个体对处理的反应方式。在这个框架中,估计对象是: τ ( x ) = E […

2023年第一届山东省职业技能大赛“网络安全”赛项B模块任务书

2023年第一届山东省职业技能大赛“网络安全”赛项B模块任务书 模块B-网络安全事件响应、数字取证调查和应用程序安全1竞赛项目简介:1.1 介绍:1.2 所需的设备、机械、装置和材料:1.3 评分方案:1.4 项目和任务的描述:2工作任务:2.1.1 数据包分析:2.1.2 Web 安全测试渗透测…

Intel官网资料下载链接

总链接: https://www.intel.com/content/www/us/en/programmable/documentation/lit-index.html eg: Pinout(TXT/EXCEL/PDF): https://www.intel.com/content/www/us/en/programmable/support/literature/lit-dp.html?1

intel官方的手册

最近在学习汇编语言,需要用到intel的手册,无论是csdn还是其他的,都要下载币,还不便宜,也很老的资料了。 直接到这个地址:https://software.intel.com/en-us/articles/intel-sdm下载吧,我下载的十…

inter-因特尔-官网

1:查询服务器CPU参数 2:去官网查询CPU指标 英特尔 | 数据中心解决方案、物联网和电脑创新

Intel SGX官网

SGX官网 SGX官网 常用链接 常用下载链接 SGX手册 《Intel_SGX_Developer_Guide》 《Intel_SGX_Developer_Reference_Linux_2.10_Open_Source》 《Intel Software Guard Extensions Programming Reference》

英特尔oneAPI创新大使招募

参加本次活动 不仅能获得奖品 还能提高技术 并有机会认识更多志同道合的小伙伴 欢迎大家踊跃参加! (PS:本次活动我们还准备了奖金哦!) 活动介绍 英特尔 oneAPI 创新大使将面向全球范围的 HPC, AI, IoT 等领域技…