calibration_tools_v1.0/search.py
2025-02-20 10:45:17 +08:00

179 lines
6.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import cv2
print(cv2.__version__) # 4.9.0
import json
import math
import copy
import numpy as np
def get_params(num_param, start, end):
return copy.deepcopy(num_param[start:end+1])
def pramas_to_num(text_param):
for item in text_param:
item['center'] = float(item['center']) * 1000
item['x'] = int(item['x'])
item['w'] = int(item['w'])
item['h'] = int(item['h'])
return text_param
def pramas_to_text(num_param):
for item in num_param:
item['center'] = str(item['center'])
item['x'] = str(item['x'])
item['w'] = str(item['w'])
item['h'] = str(item['h'])
item['x1'] = str(item['x1'])
item['y1'] = str(item['y1'])
item['x2'] = str(item['x2'])
item['y2'] = str(item['y2'])
item['x3'] = str(item['x3'])
item['y3'] = str(item['y3'])
item['x4'] = str(item['x4'])
item['y4'] = str(item['y4'])
return num_param
def sort_params(params):
sorted_params = sorted(params, key=lambda item: (item['center'], item['x']))
return sorted_params
def print_params(sort_params):
for param in sort_params:
print(param["center"], param["x"], param["w"], param["h"])
def print_path(search_path):
for path in search_path:
print(path[0], path[1])
def search_path(sort_params):
searchPath = []
for i in range(len(sort_params) - 1):
(r, theta) = cartesian_to_polar(sort_params[i]["x"], sort_params[i]["center"],
sort_params[i + 1]["x"], sort_params[i + 1]["center"])
searchPath.append([r, theta])
return searchPath
def normalize_params_and_path(sort_params, search_path, index=0):
base = sort_params[index]["h"]
for param in sort_params:
param['center'] /= base
param['x'] /= base
param['w'] /= base
param['h'] /= base
param['w/h'] = param['w'] / param['h']
if search_path != None:
for path in search_path:
path[0] /= base
# path[1] /= base
return sort_params, search_path
def read_from_json(file_path):
with open(file_path, 'r') as f:
loaded_array = json.load(f)
return loaded_array
def cartesian_to_polar(x1, y1, x2, y2):
dx = x2 - x1
dy = y2 - y1
r = math.sqrt(dx**2 + dy**2)
theta = math.atan2(dy, dx)
return r, theta
def calculate_second_point(x1, y1, r, theta_radians):
# theta_radians = math.radians(theta_degrees)
x2 = x1 + r * math.cos(theta_radians)
y2 = y1 + r * math.sin(theta_radians)
return x2, y2
def filter_params(data_bim_candi, search_path, sort_params):
loop = 0
for path in search_path:
r = path[0]
theta = path[1]
cur_parmas = sort_params[loop]
next_params = sort_params[loop + 1]
exclude_list = []
for i in range(len(data_bim_candi)):
param = data_bim_candi[i]["params"][data_bim_candi[i]["index"]]
center = param["center"]
x = param["x"]
h = param["h"]
w = param["w"]
hmw = param["w/h"]
# 长宽比大于1.5或小于0.67,则配出当前选项
if hmw / cur_parmas["w/h"] > 1.5 or hmw / cur_parmas["w/h"] < 0.67:
exclude_list.append(data_bim_candi[i])
break
# 判断下一跳位置是否击中目标
tmp_x, tmp_y = calculate_second_point(x, center, r, theta)
find = False
for j in range(len(data_bim_candi)):
tmp_param = data_bim_candi[i]["params"][j]
tmp_x = tmp_param["x"]
tmp_y = tmp_param["center"]
tmp_distence = np.linalg.norm(np.asarray([tmp_x, tmp_y]) - np.asarray([x, center]))
if abs(tmp_distence - r) < r / 10:
data_bim_candi[i]["index"] =
break
if not find:
exclude_list.append(data_bim_candi[i])
print(data_bim_candi[i]["params"][i])
loop += 1
if __name__ == "__main__":
# im_bim = cv2.imread("")
# im_sub = cv2.imread("")
data_bim = {}
data_bim["type"] = 0
data_bim["params"] = read_from_json("./params.json")
data_bim["point"] = []
data_sub_0_4 = {}
data_sub_0_4["type"] = 0
data_sub_0_4["params"] = get_params(data_bim["params"], 0, 4)
data_sub_0_4["point"] = []
data_sub_4_9 = {}
data_sub_4_9["type"] = 0
data_sub_4_9["params"] = get_params(data_bim["params"], 4, 9)
data_sub_4_9["point"] = []
data_sub_10_14 = {}
data_sub_10_14["type"] = 0
data_sub_10_14["params"] = get_params(data_bim["params"], 10, 14)
data_sub_10_14["point"] = []
print(data_sub_10_14["params"])
##################### 开始计算 ####################
# 1、计算sub的搜索路径
## 1.1 排序 y升序x升序
data_bim["params"] = pramas_to_num(data_bim["params"])
data_sub = data_sub_0_4
data_sub["params"] = pramas_to_num(data_sub["params"])
data_sub["params"] = sort_params(data_sub["params"])
_sort_params = data_sub["params"]
## 1.2生成路径数据
_search_path = search_path(_sort_params)
# print(_search_path)
## 1.3 归一化 sort_params 和 searchPath
_sort_params, _search_path = normalize_params_and_path(_sort_params, _search_path)
print_params(_sort_params)
print_path(_search_path)
# 2、开始n轮bim图的搜索首轮全部数据参与计算每轮淘汰若干选项直到整个路径搜索完毕剩下的选项都是候选目标区域
## 2.1 给bim所有的预埋件都分配一个完整的图
num = len(data_bim["params"])
_data_bim_candi = []
for i in range(num):
data_bim_copy = {}
data_bim_copy["params"] = get_params(data_bim["params"], 0, num-1)
data_bim_copy["index"] = i
_sort_params, _ = normalize_params_and_path(data_bim_copy["params"], None, i) # 用第i个件作为归一化指标
_data_bim_candi.append(data_bim_copy)
## 2.2 判断 data_sub["params"] w 和 h 的比值
filter_params(_data_bim_candi, _search_path, _sort_params)