当前位置:   article > 正文

扑克牌自动图像识别在博彩行业的应用_扑克牌图像识别

扑克牌图像识别

一、行业痛点
通常情况下,扑克牌是通过扫码来识别的。这种方案存在诸多缺陷:

  1. 游戏桌台须定制,主要是开孔,安装扫码机。
  2. 扫码机并不是100%可靠,牌稍有磨损(主要是条码磨损)就会导致多次扫码才能识别出来。
    显然,这种方案带来游戏运营的耗材开销。

二、技术解决方案
图像识别技术在近几年有了长足的发展,如opencv,机器学习平台tensorflow等日趋强大和完善。
大家对人脸识别更是记忆深刻吧,机场,海关,支付都可以刷脸了。
在这种背景下,扑克牌的图像自动识别应用似乎是小儿科的事情了。因为游戏桌台都在室内,光线充足,背景单纯,有利于图像识别算法的实施。但要达到5个9的识别准确率也并非易事。
国内使用opencv做车牌识别,一般准确率在90%左右,显然游戏行业不可能接受这么低的准确率。
好在opencv也出了深度学习模型,用深度学习模型来做识别,准确率会比单纯采用opencv算法函数
靠谱,达到5个9的准确率是完全可能的。
opencv模型 vs tensorflow模型:

  1. 对GPU要求不同,tensorflow对GPU要求高,至少得6GB独立显存。
    符合要求的显卡有:nvida GTX1660Ti/2060/2070/2080
  2. opencv对C++支持较好,而tensorflow是python语言为主。

三、面临的挑战
具体实施时,面临的挑战也不少,主要有以下几点:

  1. 荷官的翻牌动作,会遮挡牌面,成为影响识别准确率的关键因素。
  2. 人在走动时,会轻微晃动摄像头,时间长一点后,画面会发生一定程度的偏移。
  3. 荷官长时间工作疲劳后,可能将牌发得歪歪扭扭的,甚至较多地超出预设框。
  4. RTMP视频相对荷官动作来说,有1s左右的时延。
    针对上述挑战,解决方案如下:
  5. 提高相似度门槛为99%。这样多数情况下由于人手晃动导致拍照不清晰的图片识别结果就可以被过滤掉。
  6. 每次识别程序在启动时,自动进行位移校正。校正通过后,再启动识别进程。
    这主要是为了提高识别速度,采用了预定位(定位框)的方案。因为每张桌台桌布一旦确定,基本上就不会变了。
  7. 扑克框的位置,向外扩大20%。但实际牌仍然可能超出预定位框外,针对这种情况,
    就是最后仍然无法识别的情况,用自动定位算法来识别。
    如何判断预定位框无法完成识别呢?
    超出最大识别时间+2s(需要一直统计平均识别时间和最大识别时间)仍然无法识别全部牌的。
  8. 视频延迟的问题,其实并无多大影响。因为荷官或客人看到视频,相对现场来说,就是有延迟的,比如有1s延迟。
    识别算法采用预定位方案,识别一张牌的时间为5ms,即使是4门牛牛,最多也只需要105ms。也就是说,视频延迟增大
    为1s+105ms,基本上跟先前一样。
    如果翻牌是严格顺序化的,或许还是希望延迟尽量小一些,最好是延迟缩减到200ms以内,
    我们可以将识别算法部署到推流机上,由推流软件来调用识别算法或是各自单独从capture去取video。
    200ms的延迟需求是可以满足的。

四、部署
首先要改造真人直播现场:

 

 

HSV颜色空间

  1. 增加一台近景摄像头(200万像素),人眼可以清晰看清楚桌面扑克牌。
  2. 桌布明确分框(画框线)以便识别算法区分扑克,同时也是作为预定位使用。
    标准的扑克牌大小:63*88mm。以此参照,建议行间距>20mm, 列间距>10mm,线宽>3mm。
    框的颜色与桌布的背景色要明确区分,比如背景用蓝色,框用黄色。但如果背景用绿色或橙色,框用黄色,
    区分就不明显了,定位可能存在问题。
    现场推流机硬件配置也要确认,根据推流软件占用CPU的情况来确认。
    如果推流软件CPU占用率>60%,那么,建议增加nvida独立显卡,普通的nvida显卡就行,显存>4GB。
    如果推流软件CPU占用率<60%并且也没有新增推流需求,则可以考虑用算法CPU版本以降低硬件成本。
    一般建议用GPU版本算法,几乎不占CPU,CPU占用率为5%。
  3. 识别软件
    识别软件跟荷官端软件最好部署在同一台机器。这样时延和可靠性更有保障一些。
    当然软件维护就要麻烦一些,最好是免维护的。因为桌台多的话,手工升级程序/配置数据也是非常麻烦的一件一情。所以,程序和配置数据要支持在线升级。
    性能统计数据和异常日志需要传出来,传到专门的日志服务器,以便技术人员在不影响荷官工作的情况下进行问题定位。

五、总结

  1. 如何保证100%的识别准确率?
    要保证100%准确率,不能单纯依靠算法。要借助工程手段,具体措施有:
    A.连续识别10次(按5fps的识别速度,就是2s),如果这10次的识别结果都相同,则说明识别结果正确,这时才
    对外提供识别结果。这样做就保证在荷官手扰动的情况下,识别结果的高可靠性。
    B.确定不能识别的牌,比如完全横放了,这种情况下,就给荷官提示,让荷官重新摆放一次。
    C.提供全牌情况的校正机制:一般来说,扑克牌的识别结果一旦送出,就不应该再识别,更不应该有更改。
    在全部扑克牌翻过来时,荷官会有3s~5s左右的等待时间,这个情况下,荷官的手将不再干扰识别,识别结果会是
    绝对准确的。这时,就全部重新识别一遍,跟先前的结果进行比对,如果发现不一致,就记录下来,以便改进算法。
    当然也可以更改结果,因为先前的电子牌只是展示用,并没有玩家结算。在游戏结算前发现错误进行更改,理论上是
    可以接受的。
  2. 经济效益
    一般来说,将扫码改为识别,节约多少次扫码动作,就会节约多少秒时间。以百家乐为例,翻庄和闲时,一次扫两张牌,
    后面的补牌,则一次扫一张牌。所以,只补一张牌的情况下,一局可以节约3s。按一天玩1570局算(平均一局时间55秒),可以节约
    4710秒/55秒/局 = 85局。在不增加一分钱投入的情况下,每张桌台带来可观的纯收益!

本人准备归隐,寻求一份远程的兼职开发工作,擅长C++音视频/流媒体服务器软件开发及Python后端api开发。帮忙买份社保,其它面议。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/490623
推荐阅读
相关标签
  

闽ICP备14008679号