图像处理基础函数

Mower 使用 OpenCV 处理图像,颜色通道顺序为 RGB。

坐标与区域

类型

arknights_mower/utils/typealias.py 中定义了坐标与区域的类型:

Coordinate = Tuple[int, int]
Scope = Tuple[Coordinate, Coordinate]

Coordinate 元组的两个元素分别是横坐标和纵坐标;Scope 元组的两个元素分别是区域左上角与右下角的坐标。

get_pos()

arknights_mower/utils/solverBaseSolver 类有静态方法 get_pos()get_pos() 接受三个参数,第一个参数既可以是坐标,也可以是区域。当第一个参数是坐标时,get_pos() 直接返回此坐标;当第一个参数是区域时,根据第二、第三个参数 x_ratey_rate 获取区域中指定比例的坐标。默认值 x_rate=0.5y_rate=0.5,也就是获取区域中央的坐标。

get_pos() 接受的第一个参数为区域时,若 x_ratey_rate 超过 1 或小于 0,可得到位于区域外的坐标。

va()vs()sa()

arknights_mower/utils/vector.py 提供了坐标的加减法与区域的偏移函数。va() 将两个坐标相加,vs() 将两个坐标相减,sa() 进行区域偏移。

使用示例
In [1]:
from arknights_mower.utils.solver import BaseSolver
In [2]:
pos1 = (50, 30)
pos2 = (80, 60)
scope = (pos1, pos2)
In [3]:
BaseSolver.get_pos(scope)
Out[3]:
(65, 45)
In [4]:
BaseSolver.get_pos(scope, x_rate=0.2, y_rate=0.8)
Out[4]:
(56, 54)
In [5]:
from arknights_mower.utils.vector import va, vs, sa
In [6]:
va(pos1, pos2)
Out[6]:
(130, 90)
In [7]:
vs(pos1, pos2)
Out[7]:
(-30, -30)
In [8]:
pos3 = (90, 40)
sa(scope, pos3)
Out[8]:
((140, 70), (170, 100))

加载图像

loadimg()

arknights_mower/utils/image.py 中提供了用于读取图像的函数 loadimg()loadimg() 接受两个参数,第一个参数 filename 是图片文件名,第二个参数 grayTrue 时返回灰度图像,否则返回 RGB 顺序的彩色图像。gray 默认为 False

loadimg() 使用 lru_cache 以避免反复加载相同的文件。可使用 loadimg.cache_clear() 清除 LRU 缓存。

loadres()

Mower 用于识别的图像素材全部位于 arknights_mower/resources 以及热更新目录 tmp/hot_update 下。使用 loadimg() 加载这些图片时,需要拼接出完整的路径,较为繁琐。loadres() 函数可简化从上述位置加载图片的过程。它接受两个参数,第一个参数 res 是图片资源名,第二个参数 grayloadimg() 中保持一致。

图片资源名的规则如下:

  1. 对于 arknights_mower/resources 下的 png 文件,只需写出相对 resources 的路径,并省略扩展名;
  2. @hot/ 表示热更新目录 tmp/hot_update
  3. 对于 jpg 文件,在资源名中需要保留 .jpg 后缀。
资源名 文件名
ope_select_start arknights_mower/resources/ope_select_start.png
navigation/episode arknights_mower/resources/navigation/episode.png
@hot/dragon_boat_festival/banner tmp/hot_update/dragon_boat_festival/banner.png
@hot/hortus/terminal.jpg tmp/hot_update/hortus/terminal.jpg

loadimg()loadres() 加载的图像,可直接用 matplotlib 显示。

使用示例
In [1]:
from matplotlib import pyplot as plt
from arknights_mower.utils.image import loadimg, loadres
In [2]:
sc = loadimg("/home/zhao/Documents/mower-profile/screenshot/201/20240707154102.png")
plt.imshow(sc)
plt.show()
2024-07-07 15:43:37,996 - DEBUG - /home/zhao/Documents/arknights-mower/arknights_mower/utils/image.py:44 - loadimg - /home/zhao/Documents/mower-profile/screenshot/201/20240707154102.png
No description has been provided for this image
In [3]:
sc = loadimg("/home/zhao/Documents/mower-profile/screenshot/201/20240707154102.png", True)
plt.imshow(sc, cmap="gray", vmin=0, vmax=255)
plt.show()
2024-07-07 15:44:04,711 - DEBUG - /home/zhao/Documents/arknights-mower/arknights_mower/utils/image.py:44 - loadimg - /home/zhao/Documents/mower-profile/screenshot/201/20240707154102.png
No description has been provided for this image
In [5]:
res = loadres("ope_select_start")
plt.imshow(res)
plt.show()
2024-07-07 15:45:05,052 - DEBUG - /home/zhao/Documents/arknights-mower/arknights_mower/utils/image.py:44 - loadimg - /home/zhao/Documents/arknights-mower/arknights_mower/resources/ope_select_start.png
No description has been provided for this image
In [7]:
res = loadres("ope_select_start", True)
plt.imshow(res, cmap="gray", vmin=0, vmax=255)
plt.show()
No description has been provided for this image

裁切图像

arknights_mower/utils/image.py 中提供 cropimg() 方法,接受两个参数:第一个参数 img 可以是灰度或彩色图像;第二个参数 scope 是裁切的区域。函数返回裁切后的图像。注意 cropimg() 返回的图像没有经过复制,如果要修改裁切后的图像,并且不想修改原图像,需要自己复制一次。

使用示例
In [2]:
from matplotlib import pyplot as plt
from arknights_mower.utils.image import cropimg, loadimg
In [3]:
sc = loadimg("/home/zhao/Documents/mower-profile/screenshot/201/20240709094558.png")
plt.imshow(sc)
plt.show()
2024-07-09 15:29:53,129 - DEBUG - /home/zhao/Documents/arknights-mower/arknights_mower/utils/image.py:44 - loadimg - /home/zhao/Documents/mower-profile/screenshot/201/20240709094558.png
No description has been provided for this image
In [4]:
img = cropimg(sc, ((40, 60), (300, 200)))
plt.imshow(img)
plt.show()
No description has been provided for this image

二值化

arknights_mower/utils/image.pythres2() 方法用于将灰度图像二值化,接受两个参数:第一个参数 img 为灰度图像;第二个参数 thresh 为阈值。函数返回二值化后的图像。

使用示例
In [1]:
from matplotlib import pyplot as plt
from arknights_mower.utils.image import loadimg, thres2
In [2]:
sc = loadimg("/home/zhao/Documents/mower-profile/screenshot/302/20240713110952.png", True)
plt.imshow(sc, cmap="gray", vmin=0, vmax=255)
plt.show()
2024-07-13 15:12:28,741 - DEBUG - /home/zhao/Documents/arknights-mower/arknights_mower/utils/image.py:44 - loadimg - /home/zhao/Documents/mower-profile/screenshot/302/20240713110952.png
No description has been provided for this image
In [3]:
img = thres2(sc, 245)
plt.imshow(img, cmap="gray", vmin=0, vmax=255)
plt.show()
No description has been provided for this image