opencv扩展裁图

昨天要做一个裁图任务,但是有时候会截到图片外面去,即裁图的时候截到外面去的设置为黑色,在图片内部的保持原状,然后找了好久,也没有找到相应的资料,所以最后就设计了一个,验证之后效果还可以,所以将代码贴出来,希望可以帮助到需要的童鞋~

1我们要求从原图(512*512)上面裁出来(224*224)的小图,所以相应的右下是224-(x_u-512)=736-x_u

#coding=utf-8
import os
import numpy as np
import cv2

def crop_file(file,label_file):
    file_list=[]
    label_list=[]
    coord_list=[]

    img=cv2.imread(file)
    tmp_img=np.zeros((224,224,3),np.float32)
    with open(label_file,'r') as f:
        lines=f.readlines()
    lines=[line.strip().split(" ")[1:] for line in lines]
    for i,line in enumerate(lines):
        x_c=int(line[1])
        y_c=int(line[2])
        w=int(line[3])
        h=int(line[4])

        x_u=x_c-112
        y_u=y_c-112
        x_d=x_u+224
        y_d=y_u+224

        ## 设计阶段,判断左上角点是否出界(出左边或者出上边,或者左上边界都出)
        # if x_u<0 or y_u<0:
        #     tmp_img[-y_u:224,-x_u:224]=img[0:y_d,0:x_d]
        # if x_u<0 and y_u>0:
        #     tmp_img[0:224,-x_u:224]=img[y_u:y_d,0:x_d]
        # if x_u>0 and y_u<0:
        #     tmp_img[-y_u:224,0:224]=img[0:y_d,x_u:x_d]
        ## 相应的右下点类似,没有列出来

        tmp_img[max(0,-y_u):min(736-y_d,224),max(0,-x_u):min(736-x_d,224)]=\
            img[max(0,y_u):min(512,y_d),max(0,x_u):min(512,x_d)]
        file_list.append(tmp_img)
        label_list.append(line[0])
        coord_list.append([h,w,y_u,y_d,x_u,x_d])
    return img,file_list,label_list,coord_list


def random_crop_for_dirs(dir,label_dir,):
    for root,dirs,files in os.walk(dir):
        for file in files:
            cur_path=os.path.join(root,file)
            label_path=os.path.join(label_dir,file.split(".")[0]+".txt")
            crop_file(cur_path,label_path)
if __name__=="__main__":
    dir="/media/hp/CCSA_X64FRE/car_val_data/test/images"
    label_dir="/media/hp/CCSA_X64FRE/car_val_data/test/labels"
    dst_dir="/media/hp/CCSA_X64FRE/car_val_data/test/adve_imgs"
    if os.path.exists(dst_dir)==False:
        os.mkdir(dst_dir)
    random_crop_for_dirs(dir,label_dir)

猜你喜欢

转载自blog.csdn.net/u014038273/article/details/80702415