数美的缺口识别 + 轨迹生成

发布时间 2023-06-20 16:47:38作者: 守护式等待

数美的缺口识别 + 轨迹生成

import math
import random

import cv2
import numpy as np
import requests


def get_distance(fg, bg):
    fg_image = np.asarray(
        bytearray(requests.get(url=fg, verify=False).content), dtype="uint8"
    )
    fg_image = cv2.imdecode(fg_image, 1)
    shape = fg_image.shape
    x_points, y_points = [], []
    for x_point in range(shape[0]):
        for y_point in range(shape[1]):
            if list(fg_image[x_point][y_point]) != [0, 0, 0]:
                x_points.append(x_point)
                y_points.append(y_point)
    fg_cut_image = fg_image[
        min(x_points) : max(x_points),
    ]

    bg_image = np.asarray(
        bytearray(requests.get(url=bg, verify=False).content), dtype="uint8"
    )
    bg_image = cv2.imdecode(bg_image, 1)
    bg_cut_image = bg_image[
        min(x_points) : max(x_points),
    ]

    result = cv2.matchTemplate(bg_cut_image, fg_cut_image, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    distance = max_loc[0]
    return int(distance)


def get_track(distance: int):
    """
    获取轨迹
    Args:
        distance: 距离

    Returns:

    """
    x = [0, 0]
    y = [0, 0, 0]
    z = [0]
    count = np.linspace(-math.pi / 2, math.pi / 2, random.randrange(20, 30))
    func = list(map(math.sin, count))
    nx = [i + 1 for i in func]
    add = random.randrange(10, 15)
    sadd = distance + add
    x.extend(list(map(lambda x: x * (sadd / 2), nx)))
    x.extend(np.linspace(sadd, distance, 3 if add > 12 else 2))
    x = [math.floor(i) for i in x]
    for i in range(len(x) - 2):
        if y[-1] < 30:
            y.append(y[-1] + random.choice([0, 0, 1, 1, 2, 2, 1, 2, 0, 0, 3, 3]))
        else:
            y.append(
                y[-1] + random.choice([0, 0, -1, -1, -2, -2, -1, -2, 0, 0, -3, -3])
            )
    for i in range(len(x) - 1):
        z.append(
            (z[-1] // 100 * 100)
            + 100
            + random.choice([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2])
        )
    trace = list(map(list, zip(x, y, z)))
    times = trace[-1][-1] + random.randint(1, 5)
    return trace, times

fg = 'https://castatic.fengkongcloud.cn/crb/slide-atlas-default-without-logo-20230423/v4/c7db06c0414b3faa735cbc324bdfd7ff_fg.png'
bg = 'https://castatic.fengkongcloud.cn/crb/slide-atlas-default-without-logo-20230423/v4/c7db06c0414b3faa735cbc324bdfd7ff_bg.jpg'
print(get_distance(fg, bg))
print(get_track(get_distance(fg, bg)))