diff --git a/bim_im.jpg b/bim_im.jpg new file mode 100644 index 0000000..f556dfb Binary files /dev/null and b/bim_im.jpg differ diff --git a/result.png b/result.png new file mode 100644 index 0000000..9b4bcb5 Binary files /dev/null and b/result.png differ diff --git a/search.py b/search.py index 965bbc2..644ff3e 100644 --- a/search.py +++ b/search.py @@ -380,6 +380,7 @@ def bim_compare_to_hd_roi(hd_roi_list, hd_img_width, hd_img_height, bim_im_heigh } ] """ + # bim_im = gen_im_from_params(bim_rect_list) # bim图 # 高清相机坐标转换为bim图坐标,宽高肯定都是等比的直接按照bim上面高清矩形的宽度,算下比例。 scale_w = bim_sub_area["hd_cam_w_bim"] / hd_img_width scale_h = bim_sub_area["hd_cam_h_bim"] / hd_img_height @@ -399,25 +400,58 @@ def bim_compare_to_hd_roi(hd_roi_list, hd_img_width, hd_img_height, bim_im_heigh if is_x_cross_left_border_line or is_x_cross_right_border_line or is_y_cross_top_border_line or is_y_cross_bottom_border_line: hd_roi_out_of_range_index.append(hd_roi_index) # 画出来试试 - # bim_im = cv2.rectangle(bim_im, (hd_roi[0][0], hd_roi[0][1]), (hd_roi[2][0], hd_roi[2][1]), (0, 0, 255), 30) + # cv2.rectangle(bim_im, (hd_roi[0][0], hd_roi[0][1]), (hd_roi[2][0], hd_roi[2][1]), (0, 0, 255), 30) # 写上i编号 # cv2.putText(bim_im, str(hd_roi_index), (hd_roi[0][0], hd_roi[0][1]), cv2.FONT_HERSHEY_SIMPLEX, 5, (0, 0, 255),20) + # cv2.imwrite("bim_im.jpg", bim_im) + # print(f"超出边界的ROI的索引是:{hd_roi_out_of_range_index}") + + # ====================== 遍历bim所有的矩形,找到与高清相机ROI匹配的矩形 开始 ========================= + # bim所有的矩形,注意bim原数据是以左下角为原点的坐标系 !!! # bim所有的矩形,注意bim原数据是以左下角为原点的坐标系 !!! # bim所有的矩形,注意bim原数据是以左下角为原点的坐标系 !!! - # 遍历bim所有的矩形,找到与高清相机ROI匹配的矩形 bim_rect_hit_list = [] + bim_rect_in_hd_roi_list =[] + # 1. 从bim中筛选出在高清相机ROI范围内的矩形(不完整的矩形,也算上,因为转换到bim图上面的高清的ROI范围不是很准确的。) for bim_rect_index, bim_rect_item in enumerate(bim_rect_list): - # x不需要转换 - bim_rect_item_center_x = bim_rect_item["x"] - # 把y坐标系转换成左上角坐标系 - bim_rect_item_center_y = bim_im_height - bim_rect_item["center"] - # 逐一和高清相机ROI坐标进行匹配 - for hd_roi_index, hd_roi in enumerate(hd_roi_list): - if(hd_roi_index in hd_roi_out_of_range_index): - continue + # 把bim矩形的坐标系转换成左上角的坐标系, + # 矩形左上角 + x1 = int(bim_rect_item['x'] - bim_rect_item['w'] / 2) + y1 = bim_im_height - int(bim_rect_item['center'] + bim_rect_item['h'] / 2) + # 矩形右下角 + x3 = int(bim_rect_item['x'] + bim_rect_item['w'] / 2) + y3 = bim_im_height - int(bim_rect_item['center'] - bim_rect_item['h'] / 2) + # 高清的roi范围 + hd_roi_x_start = bim_sub_area["hd_cam_x_bim"] + hd_roi_x_end = bim_sub_area["hd_cam_x_bim"] + bim_sub_area["hd_cam_w_bim"] + hd_roi_y_start = bim_sub_area["hd_cam_y_bim"] + hd_roi_y_end = bim_sub_area["hd_cam_y_bim"] + bim_sub_area["hd_cam_h_bim"] + # 开始判断 + # 如矩形左上角在在高清ROI范围内 或着右下角在高清ROI范围之内 就算矩形在高清ROI之内 + is_1_inside = (x1 >= hd_roi_x_start and x1 <= hd_roi_x_end) and (y1 >= hd_roi_y_start and y1 <= hd_roi_y_end) + is_3_inside = (x3 >= hd_roi_x_start and x3 <= hd_roi_x_end) and (y3 >= hd_roi_y_start and y3 <= hd_roi_y_end) + if(is_1_inside or is_3_inside): + bim_rect_in_hd_roi_list.append(bim_rect_item) + + print(f"[bim上在高清相机矩形范围内预埋件数量为] ====== [{len(bim_rect_in_hd_roi_list)}]") + + # 2. 先根据中心点是否落在高清ROI内,第一次匹配。 + un_hit_hd_roi_list = [] #中心点匹配,没匹配上的高清ROI,用来进行第三步的中心点距离匹配 + bim_rect_hit_index_list = [] # bim上已经被匹配上的索引 + for hd_roi_index, hd_roi in enumerate(hd_roi_list): + if (hd_roi_index in hd_roi_out_of_range_index): + continue + is_hd_roi_hit = False + for bim_rect_index, bim_rect_item in enumerate(bim_rect_in_hd_roi_list): + # x不需要转换 + bim_rect_item_center_x = bim_rect_item["x"] + # 把y坐标系转换成左上角坐标系 + bim_rect_item_center_y = bim_im_height - bim_rect_item["center"] + # 逐一和高清相机ROI坐标进行匹配,判断哪一个高清ROi的中心点距离bim上面这块 + center_distance_min = 0 # 如果中心点的坐标在某个高清相机ROI内,就认为匹配上了。 bim_rect_item_center_x_inside = hd_roi[0][0] < bim_rect_item_center_x < hd_roi[1][0] bim_rect_item_center_y_inside = hd_roi[0][1] < bim_rect_item_center_y < hd_roi[2][1] @@ -426,7 +460,44 @@ def bim_compare_to_hd_roi(hd_roi_list, hd_img_width, hd_img_height, bim_im_heigh "bim_rect": bim_rect_item, "hd_roi": hd_roi }) + bim_rect_hit_index_list.append(bim_rect_index) + is_hd_roi_hit = True + break + # 没匹配上的,存起来第三步再匹配 + if(is_hd_roi_hit == False): + un_hit_hd_roi_list.append(hd_roi) + + + # 3. 如过中心点匹配有的高清ROI没匹配上去,再使用中心点距离去匹配 + for hd_roi_index, hd_roi in enumerate(un_hit_hd_roi_list): + if (hd_roi_index in hd_roi_out_of_range_index): + continue + hd_roi_center_x = int(hd_roi[0][0] + (hd_roi[2][0] - hd_roi[0][0]) / 2) + hd_roi_center_y = int(hd_roi[0][1] + (hd_roi[2][1] - hd_roi[0][1]) / 2) + center_distance_min = 99999 # 距离最小的值 + center_distance_min_bim_rect_index = -1 # 距离最小的值这个bim的索引 + # 逐一和bim进行匹配,找到bim中心点距离这个高清相机ROI的中心点最近的 + for bim_rect_index, bim_rect_item in enumerate(bim_rect_in_hd_roi_list): + # 如果中心点已经匹配过的,跳过 + if(bim_rect_index in bim_rect_hit_index_list): + continue + # x不需要转换 + bim_rect_item_center_x = bim_rect_item["x"] + # 把y坐标系转换成左上角坐标系 + bim_rect_item_center_y = bim_im_height - bim_rect_item["center"] + # 计算中心点距离 + center_distance = math.sqrt((hd_roi_center_x - bim_rect_item_center_x) ** 2 + (hd_roi_center_y - bim_rect_item_center_y) ** 2) + if(center_distance < center_distance_min): + center_distance_min = center_distance + center_distance_min_bim_rect_index = bim_rect_index + bim_rect_hit_list.append({ + "bim_rect": bim_rect_in_hd_roi_list[center_distance_min_bim_rect_index], + "hd_roi": hd_roi + }) + return bim_rect_hit_list + + # ====================== 遍历bim所有的矩形,找到与高清相机ROI匹配的矩形 开始 ========================= # 画出bim_rect_hit_list # for bim_rect_hit_item in bim_rect_hit_list: # bim_rect = bim_rect_hit_item["bim_rect"] @@ -807,13 +878,14 @@ if __name__ == "__main__": bim_im_resize = cv2.resize(bim_im, (int(bim_im.shape[1] / 6), int(bim_im.shape[0] / 6))) cv2.imshow("bim_im_resize", bim_im_resize) - image = cv2.imread("data_sub/test_5/wide_image.png") - image_x_min = int(640 * 0.1) # 左边界的裁剪点 - image_x_max = int(640 * (1 - 0.1)) # 右边界的裁剪点 - cropped_image = image[:, image_x_min:image_x_max] + # image = cv2.imread("data_sub/test_5/wide_image.png") + # image_x_min = int(640 * 0.1) # 左边界的裁剪点 + # image_x_max = int(640 * (1 - 0.1)) # 右边界的裁剪点 + # cropped_image = image[:, image_x_min:image_x_max] + # cv2.imshow("image", image) # 展示 cv2.imshow("cropped_image", cropped_image) - cv2.imshow("image", image) + diff --git a/test.py b/test.py index fad0626..c4242d1 100644 --- a/test.py +++ b/test.py @@ -1,18 +1,60 @@ +import numpy as np import cv2 -from utils import get_hd_cam_rect +from search import gen_im_from_params, get_bim_height, bim_compare_to_hd_roi, read_from_json +from utils import get_hd_roi_from_txt +roi_list_after_cal = [ + np.array([[338, 164], + [462, 164], + [462, 289], + [338, 289]], dtype=np.int32), + np.array([[296, 86], + [360, 86], + [360, 151], + [296, 151]], dtype=np.int32), + np.array([[113, 1], + [207, 1], + [207, 88], + [113, 88]], dtype=np.int32), + np.array([[206, 259], + [281, 259], + [281, 335], + [206, 335]], dtype=np.int32), + np.array([[384, 35], + [448, 35], + [448, 102], + [384, 102]], dtype=np.int32), + np.array([[127, 180], + [275, 180], + [275, 241], + [127, 241]], dtype=np.int32) +] -def _darw_rect(im): - x, y, w, h = get_hd_cam_rect(0) - print(w) - print(h) - cv2.rectangle(im, (x, y), (x + w, y + h), (0, 255, 0), 5) +image = cv2.imread("./result.png") +for index in range(len(roi_list_after_cal)): + item = roi_list_after_cal[index] + cv2.polylines(image, [item], True, (0, 0, 255), 2) + # index + cv2.putText(image, str(index), (item[0][0], item[0][1]+5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), + 2) -sub_im = cv2.imread("data_sub/test_1/wide_image.png") - -_darw_rect(sub_im) -cv2.imshow("sub_zero", sub_im) +cv2.imshow("image", image) cv2.waitKey(0) +# ====================== 预埋件号码匹配 开始 ========================= +data_bim_json = read_from_json("data_bim.json") # bim数据 +bim_sub_area = {'code': 1, 'type': '250x1450', 'x': 945, 'y': 0, 'center': 351, 'w': 1450, 'h': 250, 'angle': '0', 'x1': 220, 'y1': 1833, 'x2': 1670, 'y2': 1833, 'x3': 1670, 'y3': 2083, 'x4': 220, 'y4': 2083, 'x_center': 945, 'y_center': 1958, 'effective_points': [[220, 1833, 0], [1670, 1833, 0], [1670, 2083, 0], [220, 2083, 0], [945, 1958, 0], [773, 1405, 1], [1073, 1405, 1], [1073, 1705, 1], [773, 1705, 1], [923, 1555, 1], [1388, 1005, 2], [1888, 1005, 2], [1888, 1506, 2], [1388, 1506, 2], [1638, 1255, 2], [393, 1035, 3], [1041, 1035, 3], [1041, 1285, 3], [393, 1285, 3], [717, 1160, 3], [1212, 641, 4], [1462, 641, 4], [1462, 891, 4], [1212, 891, 4], [1337, 766, 4], [1655, 435, 5], [1904, 435, 5], [1904, 684, 5], [1655, 684, 5], [1779, 559, 5], [349, 154, 6], [748, 154, 6], [748, 554, 6], [349, 554, 6], [548, 354, 6], [992, 0, 7], [1294, 0, 7], [1294, 300, 7], [992, 300, 7], [1143, 150, 7], [1594, 2, 8], [1896, 2, 8], [1896, 302, 8], [1594, 302, 8], [1745, 152, 8], [2215, 1840, 9], [2215, 2088, 9], [2938, 1964, 9], [2798, 1413, 10], [3095, 1413, 10], [3095, 1711, 10], [2798, 1711, 10], [2946, 1562, 10], [3390, 1020, 11], [3390, 1519, 11], [2419, 1041, 12], [3067, 1041, 12], [3067, 1286, 12], [2419, 1286, 12], [2743, 1163, 12], [3214, 636, 13], [3214, 883, 13], [3337, 759, 13], [2352, 155, 15], [2744, 155, 15], [2744, 553, 15], [2352, 553, 15], [2548, 354, 15], [2996, 12, 16], [3289, 12, 16], [3289, 312, 16], [2996, 312, 16], [3142, 162, 16]], 'start_point': (-643, -805), 'end_point': (3413, 2998), 'score': (0.9973816190955833, 73, 2007.9927917215468, -0.5308235609555432), 'match_score': 0.49774032187522993, 'hd_cam_x_bim': -135, 'hd_cam_y_bim': 304, 'hd_cam_w_bim': 2472, 'hd_cam_h_bim': 1854} +bim_im = gen_im_from_params(data_bim_json) # bim图 +hd_roi_list = get_hd_roi_from_txt("data_sub/test_1/roi_conners.txt") # 高清摄像头的ROI数据 +hd_img_width = int(9344/16) +hd_img_height = int(7000/16) +bim_im_height = get_bim_height(data_bim_json) +bim_rect_hit_list = bim_compare_to_hd_roi(roi_list_after_cal, hd_img_width, hd_img_height, bim_im_height, bim_sub_area, + data_bim_json) + +print(f"[bim_rect_hit_list] ====== [{len(bim_rect_hit_list)}]") +# ===================== 预埋件号码匹配 结束 =========================== + +