crop图片后,同时修改物体相应的坐标
生活随笔
收集整理的這篇文章主要介紹了
crop图片后,同时修改物体相应的坐标
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1、不考慮crop后物體與crop前的IoU:
- 2、考慮crop后物體與crop前的IoU:
- 3、IoU代碼:
1、不考慮crop后物體與crop前的IoU:
def crop_im_annos(self, data):pim = cv2.imread(data["filename"])height, width = pim.shape[0:2]lugg_anno = copy.deepcopy(data["luggage_annos"])if len(data["luggage_annos"]) > 1: # "pedestrain_annos" in data.keys():ped_anno = copy.deepcopy(data["pedestrain_annos"])ped_box = [ped_anno["x"], ped_anno["y"], ped_anno["x"] + ped_anno["width"] - 1,ped_anno["y"] + ped_anno["height"] - 1]left_xcoord = max(0, ped_anno["x"] - 0.65 * ped_anno["width"])right_xcoord = min(width, ped_anno["x"] + ped_anno["width"] - 1 + 0.65 * ped_anno["width"])right_ycoord = min(height,ped_anno["y"] + ped_anno["height"] - 1 + 0.15 * ped_anno["height"]) # todo 0.05->0.15pim = pim[int(ped_anno["y"]):int(right_ycoord), int(left_xcoord):int(right_xcoord)]for la in lugg_anno:offset = la["x"] - left_xcoordla["x"] = max(0, offset)la["y"] = max(0, la["y"] - ped_anno["y"])if la["x"] > ped_anno["x"] - left_xcoord:la["width"] = min(la["width"], (right_xcoord - left_xcoord) - la["x"])la["height"] = min(la["height"], (right_ycoord - ped_anno["y"]) - la["y"])else:if la["x"] == 0:la["width"] = la["width"] + offsetla["height"] = min(la["height"], (right_ycoord - ped_anno["y"]) - la["y"])return pim, lugg_anno2、考慮crop后物體與crop前的IoU:
def crop_im_annos(self, data):pim = cv2.imdecode(np.fromfile(data["filename"]), 1)if pim is None:pim = cv2.imread(data["filename"], 1)anno = copy.deepcopy(data["annotations"])height, width = pim.shape[0:2]if len(data["pedes_annotations"]) > 0: # 對有持刀的圖片進行cropped_anno = copy.deepcopy(data["pedes_annotations"])[0]knife_anno = copy.deepcopy(data["knife_annotations"])[0]ped_box = [ped_anno["x"], ped_anno["y"], ped_anno["x"] + ped_anno["width"] - 1,ped_anno["y"] + ped_anno["height"] - 1]left_xcoord = max(0, ped_anno["x"] - 0.25 * ped_anno["width"])right_xcoord = min(width, ped_anno["x"] + ped_anno["width"] - 1 + 0.25 * ped_anno["width"])left_ycoord = max(0,ped_anno["y"] - 0.15 * ped_anno["height"])res_pim = pim[int(left_ycoord):int(ped_anno["y"] + ped_anno["height"]), int(left_xcoord):int(right_xcoord)]for i, s_anno in enumerate(anno):s_anno["x1"] = s_anno["x"]s_anno["y1"] = s_anno["y"]s_anno["x2"] = s_anno["x"] + s_anno["width"] - 1s_anno["y2"] = s_anno["y"] + s_anno["height"] - 1s_anno["x1"] = max(0, s_anno["x1"] - left_xcoord)s_anno["y1"] = max(0, s_anno["y1"] - left_ycoord)s_anno["x2"] = min(right_xcoord - left_xcoord, s_anno["x2"] - left_xcoord)s_anno["y2"] = max(0, s_anno["y2"] - left_ycoord)g_anno_w = data["annotations"][i]["width"]g_anno_h = data["annotations"][i]["height"]s_anno_w = s_anno["x2"] - s_anno["x1"]s_anno_h = s_anno["y2"] - s_anno["y1"]# 判斷crop圖片后的物體與crop圖片前的物體IoU,如果IoU<0.7則做進一步的處理if s_anno_w * s_anno_h / g_anno_w * g_anno_h > 0.7:s_anno["x"] = s_anno["x1"]s_anno["y"] = s_anno["y1"]s_anno["width"] = s_anno["x2"] - s_anno["x1"]s_anno["height"] = s_anno["y2"] - s_anno["y1"]else:if knife_anno["x"] > ped_anno["x"]:for s_pb in ped_box:ped_box[0] = max(0, min(ped_box[0], s_pb["x"]))ped_box[1] = max(0, min(ped_box[1], s_pb["y"]))ped_box[2] = min(pim.shape[1] - 1, max(ped_box[2], s_pb["x"] + s_pb["width"] - 1))ped_box[3] = min(pim.shape[0] - 1, max(ped_box[3], s_pb["y"] + s_pb["height"] - 1))ped_box = [int(b) for b in ped_box]res_pim = pim[ped_box[1]:ped_box[3], int(left_xcoord):ped_box[2]]for sa in anno:sa["x"] -= ped_box[0]sa["y"] -= left_xcoordelse:for s_pb in ped_box:ped_box[0] = max(0, min(ped_box[0], s_pb["x"]))ped_box[1] = max(0, min(ped_box[1], s_pb["y"]))ped_box[2] = min(pim.shape[1] - 1, max(ped_box[2], s_pb["x"] + s_pb["width"] - 1))ped_box[3] = min(pim.shape[0] - 1, max(ped_box[3], s_pb["y"] + s_pb["height"] - 1))ped_box = [int(b) for b in ped_box]res_pim = pim[ped_box[1]:ped_box[3], ped_box[0]:int(right_xcoord)]for sa in anno:sa["x"] -= ped_box[0]sa["y"] -= ped_box[1]return res_pim, anno3、IoU代碼:
def IoU(self, boxA, boxB):boxA = [int(x) for x in boxA]boxB = [int(x) for x in boxB]xA = max(boxA[0], boxB[0])yA = max(boxA[1], boxB[1])xB = min(boxA[2], boxB[2])yB = min(boxA[3], boxB[3])interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1)iou = interArea / float(boxAArea + boxBArea - interArea)return iou總結
以上是生活随笔為你收集整理的crop图片后,同时修改物体相应的坐标的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对图片进行裁减预处理
- 下一篇: 评估行人行动预测的基准——Benchma