斗地主、跑得快记牌器开发思路

此项目只是作为技术研究讨论,不是外挂,不能包赢。不具备透视,控牌登外挂性质的功能!!只是一个辅助记牌的功能!!棋牌游戏只是适当的娱乐放松,不是赌博!大家一定要反正心态来对待这个东西。

1. **明确项目目标:**首先,明确你的项目的主要目标。你的应用是否只是用来记录已经出过的牌,还是需要提供更多的功能,如分析其他玩家的策略,或者为玩家提供决策建议?理解你的应用的核心功能是非常重要的。

2. **选择开发平台:**你需要决定你的应用将在哪个平台上运行。是要做一个移动应用(iOS、Android)还是一个桌面应用?这个选择将会影响到你的开发工具和技术栈。

3. **学习编程技能:**如果你不是已经具备开发经验的程序员,你可能需要学习一些编程技能。这取决于你选择的平台和技术。例如,如果你选择开发一个移动应用,你需要学习相关的编程语言(如Swift或Kotlin)。

4. **数据存储和处理:**你需要一种方法来存储和处理已经出过的牌的数据。数据库技术可能会派上用场,因为你需要追踪玩家每一轮出的牌。

5. **用户界面设计:**设计一个易于使用的用户界面对于应用的成功至关重要。确保界面能够清晰地显示已出的牌,并为用户提供添加或删除牌的选项。

6. **开发和测试:**一旦你理解了你的项目目标、学习了所需的技能、准备好了数据存储和用户界面,你可以开始开发你的应用。在开发的过程中,不要忘记进行测试以确保应用的稳定性和可靠性。

7. **反馈和改进:**一旦你的应用完成并投入使用,寻找一些朋友或玩家来测试它。他们的反馈可以帮助你改进应用,使它更符合用户需求。

8. **发布和推广:**最后,一旦你对应用感到满意,你可以将其发布到相关的应用商店或平台上,并开始推广它。社交媒体、朋友和家人的口碑都可以帮助你扩大用户群。

无论你决定如何开发这个应用,坚持学习和不断改进将是成功的关键。祝你好运!

  1. 图像的快速截取
  2. 图像的预处理
  3. 识别模型的设计和训练
  4. 图像匹配
  5. 业务逻辑的实现

原来开发麻将的图像识别和地主的图像识别 都是使用的YOLO来开发,但是yolo比较耗显卡。电脑配置要求比较高。因为这个记牌器项目一般要在手机上运行。所以这个项目就不适合用yolo来开发。我们这个项目使用安卓版本的opencv 。识别模型是基于cnn神经网络。这个方便在手机上运行。苹果版本我们就不考虑了,好像现在是市面上的记牌器都没有基于苹果手机开发的。

 

这个项目可能会遇到下面几个难点。

1.粘连图像的分割

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

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

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

 

一 图像的快速截取(这点可以去github下载免费的开源项目来二次开发)

截屏方法有多种。我们的需求是连续,快速,少占资源,非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拿到截图

 

接下来就是我们对图像进行预处理,达到我们匹配图片的效果。各个平台的图片都是大同小异的,基本特征一下,只是轮廓不一样。一般会有下面的几个特征:

  1. 干扰多
  2. 扁平严重,图像模糊
  3. 花色和数字轻度粘连
  4. 数字和其他的图形粘连
  5. 特效的动态干扰

 

针对上面的几个特征我们找到了下面的解决办法:

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

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

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

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

 

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

到这个位置我们寻找图片的轮廓就基本完成了。

 

下面就是业务逻辑的问题。这个也是一个难点,这个你也必须要懂游戏规则才可以。我们就拿地主游戏来说,都地主游戏里面一般有3个玩家,自己,上家,和下家。

自己的出牌在中间,上家在左上角,下家在右上角,这样就区分开来了

因为经常玩牌的人都知道 如果别人除了3个A 那么很大几率他手上没有另外一个A 那个A自己没有 必然是在另外一个玩家手上,我们就可以根据这些信息来辅助我们玩牌,这个就是一个统计的算法。

接下来就是记牌了,记牌的时候可能需要注意一下。很多时候别人出连牌,很长一串的时候,有可能你只识别到了5张或者6张。但是不是玩家出的所有牌,这个时候我们有2个解决办法,第一个就是别人出牌之后等待一段时间在记录牌。另外一个办法就是 记录玩家出牌之前的牌数量,和出牌之后数量。两个相减就是别人当前出了多少牌。