下载 App

托纳姆物语编程系列(4)——如何检查背包?

修改于2024/05/29856 浏览整活专区
每天写这个的时间有限,加上这次这个确实有一点难度,这次我们先看效果在逐次讲解
没识别出来一部分一是因为我们用的OCR官方给的默认模型对特殊符号支持并不是很好,二是截图速度的问题,这个截图确实很影响整个代码的运行效率但我目前也没找到能简单抓到手机屏幕视频流的方法。

开始

以我们自己的角度来看,我们去点选背包格的时候我们会下意识的去看格子的边框去找到格子的中心,然后去点击中心就完成  了格子的点选,但是我们先整体看一下背包
TapTap
虽然边框的颜色和格子内的颜色有一定区别但是,色调是一样所以,我们不得不缩小阀值,但这不可避免的会降低我们程序的鲁棒性,我们二值化出来看一下
TapTap
二值化
可以看到整体出来不但有相当多的噪声,边框也有很多断点,所以如果仅仅这样是不够的,我们接着往下处理。首先我们先过滤噪点,调用高斯模糊做一个过滤,具体可以自己搜索了解一下,再做个边沿处理
TapTap
分别是二值化和高斯模糊后的结果
TapTap
边沿检测
可以看到最终出来的边沿检测图像还是很清晰的,我们现在只需要在做一个下形态学的闭运算把整个框架变得更加明显
TapTap
闭运算之后的图像
在做闭运算之后可以我们就可以很清晰的看到整体轮廓了,现在我们只需要调用opencv的轮廓检索
TapTap
先看一下代码
TapTap
效果图
可以看到轮廓已经很清楚的找出来了,但是有一个问题,还是有好呢多的误判,因此我直接用系列2的方法用求轮廓面积的方式过滤掉残缺的轮廓,但是不可避免的如下图所示这些因为这些有孔的装备,导致装备上的光圈溢出来让轮廓不完整,所以这些也会被我们当成错误的数据
TapTap
TapTap
到这里,大部分就结束了,我们看一下主函数调用
TapTap

结束

horizontal linehorizontal line
import cv2 as cv
import uiautomator2 as u2
import time
from paddleocr import PaddleOCR
import numpy as np
def gettext(ocr, img):
    ocr_text = ocr.ocr(img, cls=False)  # 进行识别
    ocr_text = ocr_text[0]
    if len(ocr_text):
        out_text = ocr_text[-1][-1][0]
        return out_text
    else:
        return ""
def knapsack(ocr, screen):
    bpx, bpy, epx, epy = 630, 124, 1243, 640
    img = screen[bpy:epy, bpx:epx]
    HSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)  # 转换图像为HSV格式
    # 设置颜色阈值
    lowerColor = np.array([18, 121, 100])  # 取范围最低值
    upperColor = np.array([19, 248, 156])  # 取范围最高值
    # 提取指定部分(指定区域变白,其他变黑)
    binary = cv.inRange(HSV, lowerColor, upperColor)
    # 高斯模糊
    median = cv.GaussianBlur(binary, (7, 7), 0, 0)
    # 边沿
    edges = cv.Canny(image=median, threshold1=100, threshold2=200)
    # 闭运算
    kernel = np.ones((5, 5), np.uint8)
    edges = cv.dilate(edges, kernel)
    edges = cv.erode(edges, kernel)
    contours, hierachy = cv.findContours(edges, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
    # 后两个为轮廓检索模式和轮廓逼近模式
    if len(contours) == 0:
        return -1
    # 计算每个轮廓的面积并保存到字典中
    contour_areas = {i: cv.contourArea(contour) for i, contour in enumerate(contours)}
    # 根据面积对字典进行排序
    sorted_contour_areas = dict(sorted(contour_areas.items(), key=lambda item: item[1], reverse=True))
    # 获取排序后的轮廓索引
    sorted_contour_indices = list(sorted_contour_areas.keys())
    for i in sorted_contour_indices:
        if contour_areas[i] < 13000:
            break
        M = cv.moments(contours[i])
        if M["m00"] != 0:
            cX = int(M["m10"] / M["m00"])
            cY = int(M["m01"] / M["m00"])
            d.click(cX+bpx, cY+bpy)
            text = d.screenshot(format='opencv')
           延时0.05秒
            print(gettext(ocr, text[429:463, 47:441]))
if __name__ == "__main__":
    d = u2.connect()
    print(d.info)
    延时一秒
    screen = d.screenshot(format='opencv')
    # 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
    Ocr = PaddleOCR(use_angle_cls=False, use_gpu=False,
                    lang="ch", show_log=False)  # need to run only once to download and load model into memory
    while True:
        #print(screen[624, 1266])
        screen = d.screenshot(format='opencv')
        if np.equal(screen[624, 1266], np.array([149, 154, 154])).all():
            break
        knapsack(Ocr, screen)
        d.swipe(1118, 500, 1118, 117, 0.05)
        延时0.5s
波多姆诶截图
波多姆诶
女朋友做的,周末愉快[表情_送花]
1 赞
AScript--一个简单的ui截图
AScript--一个简单的ui
趁着国庆,补一个ui,ui教程,以后有时间再写吧 通过百度网盘分享的文件:airscript 链接:https://pan.baidu.com/s/1pl7ZwsqATeKCuprx3P1MCg?pwd=mm3n 提取码:mm3n --来自百度网盘超级会员V4的分享 里面有一个pj的光速虚拟机,可以在安卓手机上多开tlom。 本来想上架,这样你们就不用配置环境也能用了,但是这个开发平台是要收费
12 赞
4 回复
新主线属性图2026截图
新主线属性图2026
整合了大佬的数据,有错的,请留言。[表情_微笑]
10 赞
2 回复
全对属门牌哦截图
全对属门牌哦
收集完了,单独为对属开一贴
29 赞
3 回复
夏活点位表更新截图
夏活点位表更新
加了海底魔导点,稍微修改了一下优先级,也会根据夏活实际情况继续更新
20 赞
2 回复
托纳姆物语编程系列(6)—— 如何认路?截图
托纳姆物语编程系列(6)—— 如何认路?
前段时间看到两年前的东西还有人看,就想着再写一点什么,本来再tlm里面做一个自动驾驶来着,但是有点过于花时间了。一是tlm视角太受限,二是我一个人每次重新训练模型很吃力。不过好在我还是基本完成了视觉部分的功能,本文中以前文章提到的东西我就不会在提了,见谅。 1. 什么是实例分割 说这个之前我得让你知道什么是对象检测,放一个图你就明白了。 对象检测识别场景中你感兴趣的目标并输出是一组边界框,这些
16 赞
13 回复
魅露瑟哈尔截图
魅露瑟哈尔
简单做了个属性表_(:з」∠)_
8 赞
2 回复
01:42
异抗压血魔导(轮椅输出)神圣教导之力截图
异抗压血魔导(轮椅输出)神圣教导之力
异抗压血魔导三维分析(满5星) 生存:★★★★★ 输出:★★ 辅助:★★★★ 声明:(等后续点燃补强了_(:з」∠)_) 有什么意见或者建议可以在帖子下面讨论(๑>؂<๑) 1.不要想着魔导输出能多高,想玩输出可以看法师攻略。 2.优点是不惧怕百分比伤害(把假血算在内的除外),正常boss伤害大部分也能抗(高额双抗)。 3.刚需卡斯魔导,没有的话,也不要考虑,附魔魔导不行。 4.不是很建议从
150 赞
106 回复
忆昔当年泪不干截图
忆昔当年泪不干
我是伍玖59,用小号发因为大号写攻略的不影响大伙心情。本篇除了一些不相干的人的名字我会用简称。 依旧先说结论,打游戏一定要打游戏,玩托拉姆一定要玩托拉姆。 本篇为回忆录,讲述一个冒险者在托拉姆物语的普通冒险生涯。完全个人视角叙事。诸位且当个乐子看。纯是这些天看这些事实在不舒服,同时也是之前受到委屈的发泄。 故事要回到2023年2月的某天,一个懵懂的年轻人下载了一个看起来有些过时的游戏,在经历了痛苦
31 赞
18 回复
02:22
手残也能身法的力耐大剑连击演示截图
手残也能身法的力耐大剑连击演示
如题,测试了一晚上的大剑连击,拿机器人反复试验,最终得出了这一看上去很奇怪的连击搭配。 核心思路:降低开爆气+狂战+战吼的蓝耗,连击多夹回旋镖可以很多时候自动回避控制打断,音速瞬间位移起手,直接打破坏之刃用增伤,然后立刻回旋镖后拉同时连击收尾。用迅捷起手魔怪斩是因为顺捷顾名思义动作快,初步有点帧伤的概念了。 之前实验的连击还不如我纯手动打,就很难蚌。这个虽然不一定比得过全手动,但至少在玩得简单好上
4 赞
4 回复