import cv2 import numpy as np import os import numpy as np #
from numpy import array import json import os from PIL import Image def img_paste(img_path, polygon_dict, save_name=False): ? ? """
? ? :param img_path: ? ? :param polygon_dict: ? ? :param save_name: ? ? :return: ? ? """
if __name__ == '__main__':
? ? ### #先读json
? ? data_path = r'F:/sef/arrow/OutputJson' ? ? output_path = r'F:/dataset/extracted_imgs' ? ? info_all = {}
#解析json ? ? arrow_dict_json ?= { ? ? ? ? 'imgs':"0", ? ? ? ? 'path':'1', ? ? ? ? 'objects':'2', ? ? ? ? 'confidence':'3', ? ? ? ? 'points':'4', ? ? ? ? 'category':5,
? ? } ? ? count = 1 ? ? count_img_noexist = 0 ? ? count_img_exist = 0 ? ? # 将 Python 字典类型转换为 JSON 对象 ? ? # 解析json ? ? json_str = json.dumps(arrow_dict_json) ? ? print(json_str) ? ? print(type(json_str))
? ? # 将 Python 字典直接输出到文件 ? ? with open('pengjunlee.json', 'w', encoding='utf-8') as f: ? ? ? ? json.dump(json_str, f, ensure_ascii=False, indent=4)
? ? #递归遍历所有的json文件 ? ? # for i in arrow_dict_json: ? ? for root, dirs, files in os.walk(data_path, topdown=False): ? ? ? ? for name in files: ? ? ? ? ? ? if name.endswith('json'): ? ? ? ? ? ? ? ? print(os.path.join(root, name))
? #提取信息
? ? arrow_dict = { ? ? ? ? 0:0, ? ? ? ? 1:'a_wf', ? ? ? ? 2: 'a_wfl', ? ? ? ? 3: 'a_wl', ? ? ? ? 4:'a_wr', ? ? ? ? 5:'a+wfr', ? ? ? ? 6:'a_W_lc', ? ? ? ? 7:'a_w_ls',
? ? } ? ? count = 1 ? ? count_img_noexist = 0 ? ? count_img_exist = 0
# # #用opencv画框 bgr_img_path = cv2.imread(r"F:/sef/arrow/Images/+.jpg",0) # gray_img = cv2.cvtColor(bgr_img_path,cv2.COLOR_BGR2GRAY,cv2.IMREAD_COLOR) ?#灰度图 # th , binary = cv2.threshold(0,255,cv2.THRESH_OTSU,) ?#将otsu法返回的阈值作为二值化的参数。 # contours ,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) ? #cv2.findContours()函数接受的参数为二值图 ?所以读取的图像要先转成灰度的,再转成二值图, # cv2.drawContours(bgr_img_path,contours,-1,(0,0,255),3) # bounding_boxes = [cv2.boundingRect(contours) for contours in contours]
#findContour用于找到不规则形状的轮廓 image, contours, hier = cv2.findContours(thresh, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cv2.RETR_EXTERNAL, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cv2.CHAIN_APPROX_SIMPLE)
for contour in contours: ? ? #计算一个简单的边界框 ? ? x,y,w,h = cv2.boundingRect(contour) ? ? #画出边界框 ? ? cv2.rectangle(img, (x,y), (x+w, y+h),(0,0,255),2) ? ? #计算包围目标的最小矩形区域 ? ? rect = cv2.minAreaRect(contour) ? ? box = cv2.boxPoints(rect) ? ? box = np.int0(box) ? ? cv2.drawContours(img, [box], 0, (255,0,255), 2) ? ? #cv2.minEnclosingCircle函数返回一个二元组,第一个元组为圆心坐标,第二个为半径 ? ? (x0,y0), radius = cv2.minEnclosingCircle(contour) ? ? center = (int(x0), int(y0)) ? ? radius = int(radius) ? ? img = cv2.circle(img, center, radius, (0,255,255))
? ? # 坐标提取
def coordinate_extract(img_path, coordinate_list): ? ? """
? ? """ ? ? coord_x = [] ? ? coord_y = [] ? ? for i in range(len(coordinate_list)): ? ? ? ? if i % 2 == 0: ? ? ? ? ? ? coord_x.append(coordinate_list[i]) ? ? ? ? else: ? ? ? ? ? ? coord_y.append(coordinate_list[i])
? ? # xmin ymin xmax ymax ? ? return min(coord_x), min(coord_y), max(coord_x), max(coord_y)
#框选
def bbox(bounding_boxes,contours,): ? ? object_dict = {}
? ? for bbox in bounding_boxes: ? ? ? ? [x,y,w,h] = bbox ? ? ? ? #用绿色(0,255,0)来画出最小的矩形框 ? ? ? ? # array=array.astype( np.uint8 )
? ? x,y,w,h = cv2.boundingRect(bgr_img_path) ? ? for bbox in bounding_boxes: ? ? ? ? [x, y, w, h] = bbox ? ? ? ? cv2.rectangle(bgr_img_path, (x, y), (x + w, y + h), (0, 255, 0), 2) ? ? ? ? # cv2.rectangle(bgr_img,(x,y),(x+w,y+h),(153,153,0),5) ? ? # cv2.rectangle(bgr_img,(x,y),(x+w,y+h),(0,255,0),2) ? ? cv2.rectangle(bgr_img_path, (x, y), (x + w, y + h), (153, 153, 0), 5) ? ? new_image = bgr_img_path[y-2:y+h+2, x-2:x + w + 2] #先用y确定高,再用x确定宽,画出矩形 ? ? bounding_boxes = [cv2.boundingRect(cnt) for cnt in contours] ? #cnt是cv2.findContours()函数返回的轮廓
? ? with open(arrow_dict, 'r') as f: ? ? ? ? org_data = [i.strip().split(';') for i in f.readlines()] ? ? ? ? # print(org_data) ? ? ? ? arrow_dict['path'] = data_path ? ? ? ? objects_list = []
? ? for idx, org_target in enumerate(org_data): ? ? ? ? object_dict = {} ? ? ? ? coordinates = coordinate_extract(img_path, org_target[1:-2]) ? ? ? ? object_dict['coordinate'] = { ? ? ? ? ? ? 'xmin': coordinates[0], ? ? ? ? ? ? 'ymin': coordinates[1], ? ? ? ? ? ? 'xmax': coordinates[2], ? ? ? ? ? ? 'ymax': coordinates[3] ? ? ? ? } ? ? ? ? # 对图片进行保存 ? ? ? ? imgs_dir = os.path.join(output_path, str(object_dict['category'])) ? ? ? ? if not os.path.exists(imgs_dir): ? ? ? ? ? ? os.mkdir(imgs_dir)
? ? ? ? ? ? print(img_path)
? ? ? ? ? ? org_img = Image.open(img_path) ? ? ? ? ? ? extracted_img = org_img.crop( ? ? ? ? ? ? ? ? (int(coordinates[0]), int(coordinates[1]), int(coordinates[2]), int(coordinates[3]))) ? ? ? ? ? ? extracted_img.save( ? ? ? ? ? ? ? ? os.path.join(imgs_dir, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'%s_%d_%s.jpg' % (name.split('.')[0], idx + 1, object_dict['cls']))) ? ? ? ? ? ? # 将目标存储为json文件 ? ? ? ? ? ? with open('annotations.json', 'w') as f: ? ? ? ? ? ? ? ? json.dump(info_all, f)
|