crop图片后,同时修改物体相应的坐标

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.15
        pim = pim[int(ped_anno["y"]):int(right_ycoord), int(left_xcoord):int(right_xcoord)]

        for la in lugg_anno:
            offset = la["x"] - left_xcoord
            la["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"] + offset
                la["height"] = min(la["height"], (right_ycoord - ped_anno["y"]) - la["y"])

    return pim, lugg_anno

2、考虑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:  # 对有持刀的图片进行crop
        ped_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"] - 1
            s_anno["y2"] = s_anno["y"] + s_anno["height"] - 1

            s_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_xcoord
                else:
                    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, anno

3、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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值