python实现批量根据坐标按比例截图

三流程序员的辛酸史,自我折磨许久之后终于写出了符合领导需求的代码。

批量输入图片,此图片的内容的坐标信息文档,截取坐标范围内并再截取比坐标小一圈的图片,

类似下图1,坐标文档截出图片如图2,然后按比例截出图3所示图片

 

具体代码如下:

import cv2
import os

RAT = 0.9

def walk_dir(*paths):
    x_list = []

    for path in paths:
        for (root, dirs, files) in os.walk(path):
            files = sorted(files)
            for item in files:
                x_list.append(item)

            return x_list


def new_cut_image(picture_name, input_dir, output_dir, txt_dir):
    txt_path = os.path.join( txt_dir, str(picture_name.split('.')[0]) + '.txt')
    f = open(txt_path)
    i =1
    for line in f.readlines():
        boxes = []
        linesp = line.split()
        x1 = linesp[1]
        y1 = linesp[2]
        x2 = linesp[3]
        y2 = linesp[4]

        boxes.append(x1)
        # print(boxes[0])
        boxes.append(y1)
        boxes.append(x2)
        boxes.append(y2)

        yr = int((int(boxes[3])-int(boxes[1]))*(1-RAT)/2)
        xr = int((int(boxes[2])-int(boxes[0]))*(1-RAT)/2)
        xmin = int(boxes[0])+xr
        ymin = int(boxes[1])+yr
        xmax = int(boxes[2])-xr
        ymax = int(boxes[3])-yr

        srcImage = cv2.imread(input_dir + picture_name)

        imageROI = srcImage[ymin:ymax, xmin:xmax]  # [ymin:ymax, xmin:xmax]
        output_path = os.path.join(output_dir, str(picture_name.split('.')[0]) + "%03d.jpg" % i)
        i += 1
        cv2.imwrite(output_path, imageROI)



if __name__ == '__main__':
    IMAGE_DIR = r'/home/stt/桌面/s/img/'
    OUTPUT_DIR = r'/home/stt/桌面/s/9/'
    txt_dir = '/home/stt/桌面/s/txt/'

    image_list = walk_dir(IMAGE_DIR)

    for image in image_list:

        new_cut_image(image, IMAGE_DIR, OUTPUT_DIR, txt_dir)

 

posted @ 2019-07-12 11:07  pjc的乖宝宝  阅读(2301)  评论(0编辑  收藏  举报