OpenCV对图片指定颜色区域识别

一、说明

根据项目需求,最近在做一些技术研究相关的工作,主要是:实时获取游戏比赛视频中每个角色的 血量大小,以及对应角色的名字,以便于对游戏中角色情况进行实时检测,从而实时预测游戏战况。
由于比赛的源数据,在游戏开发商手中,比如:和平精英游戏由某讯开发,要想拿到他们的数据是相当困难的。
而我们能做的,就是截取比赛视频上的图片,从而对截取的图片进行检测

二、 既然是研究性工作,当然我们也是想了几种实现方案的

方案一:我们通过YOLO训练识别建立模型库,找到我们要使用的数据,并对它进行识别,如下图:
YOLO(You Only Look Once)是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统


AL AG 5 7t.png

对于图片上的信息,我们可以通过OCR 来识别名字,但是对于白色的识别,我们遇到麻烦了,看到这里的小伙伴说,可以通过二值化处理啊,把白色的区域给检测出来,但是请看下图:

401 4AM • 33Sva 42m 4AM - BEGI.png

对于图片上这种情况,二值化方案不是一个好的方式,在游戏比赛过程中,这种重叠的情况并不少见,而且有时候,名字都无法识别出来,所以这种方案是不利于我们 实时检测数据的,那么我们来看看方案二

方案二:请先看下图:

RIS 60 BA E 15.png

经常玩游戏或者喜欢打终端游戏的小伙伴,对这个界面一定不陌生,这个视图是固定在左上角的,我们可以实时获取这个视图,并对它的名字和血量进行识别,由于随着血量的消耗,选手血量的颜色会有所不同,我们需要提前获取要检测目标区域的颜色,然后在计算出目标区域的大小。

获取图片的颜色:

#获取检测目标的BGR值
def getTargetColor(img):
    imgShape = img.shape
    # 获取像素坐标(5,H/2)的BGR值
    imgHeightHalf = int(imgShape[0]/2)
    BGR = np.array([img[imgHeightHalf][5][0], img[imgHeightHalf][5][1], img[imgHeightHalf][5][2]])
    print(BGR)
    return BGR

但是,由于血量在变成粉红色或者灰色的时候,不是一个纯色(半透明色),会和后面的颜色进行融合,会导致,我们在做指定区域颜色识别的时候存在一定误差,为了,可以让我们识别的区域更准确,我们可以指定一个颜色的范围 ,由于检测返回的是区域边缘的坐标,我们可以找出X 方向最大的值和X 方向最小的值,从而确定目标区域的长度,也就是血量的大小,由于我们截图的时候知道总的血量的大小,从而知道某个选手,剩余血量的百分比,以及当前的状态

C001.png

以下是核心代码:

#获取血液剩余的百分比
def getPercentageOfBloodVolume(BGR,img):
    B = int(BGR[0])
    G = int(BGR[1])
    R = int(BGR[2])

    # 寻找合适的上浮范围  不得使 RGB 值高于 255
    upRange = 20
    if 255 - B < upRange:
        upRange = 255 - B
    if 255 - G < upRange:
        upRange = 255 - G
    if 255 - R < upRange:
        upRange = 255 - R

    #寻找合适的下浮范围值 不得使 RGB 值低于 0
    lowRange = 40
    if B - lowRange < 0:
        lowRange = B
    if G - lowRange < 0:
        lowRange = G
    if R - lowRange < 0:
        lowRange = R

    # print('upRange == ',upRange)
    # print('lowRange ==',lowRange)
    upper = BGR + upRange
    lower = BGR - lowRange

    # 确定要检测的颜色范围
    mask = cv.inRange(img, lower, upper)
    (contours, hierarchy) = cv.findContours(mask.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    print('number of countours: %d' % (len(contours)))

    #================================= 测试检测范围的代码 =============================

    # 找到绘画轮廓 水平方向最大值
    originXMax = 0
    for pointArray in contours:
        for x in pointArray:
            for y in x:
                for originX in y:
                    if originXMax < originX:
                        originXMax = originX

    print('originXMax == ', originXMax)

    # 根据图片的大小判断,目前血量所占的 百分比
    imgShape = img.shape
    imgWidth = imgShape[1]
    bloodPer = originXMax / (imgWidth - 2)
    bloodPer = format(bloodPer, '.2f')
    return bloodPer

这里需要注意的是:在取值颜色范围的时候,BGR 范围取值要控制在 0 ~ 255 ,否则结果会出问题

三、总结

由于是研究性工作,这其中也遇到了很多问题和困难,不过都一一解决了,这其中也包含,怎么对文字的准确识别,以及如何矫正错误名字识别,这里暂时不过多言表,写这篇文章,一是做下记录,二是给有相似需求的小伙伴做个参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容