话不多说,上代码:
import os,cv2,json
import numpy as np
ORIGIN_IMAGE_SIZE = (2560,1440)
IMAGE_PATH = 'D:/BaiduNetdiskDownload/Curvelanes/train/images'
LABEL_PATH = 'D:/BaiduNetdiskDownload/Curvelanes/train/labels'
def my_generator():
#获得label文件夹下json文件名
label_file_name_list = os.listdir(LABEL_PATH)
#获得image文件夹下png文件名
image_file_name_list = os.listdir(IMAGE_PATH)
for image_file_name,label_file_name in zip(image_file_name_list,label_file_name_list):
#加载图片
raw_img = cv2.imread(IMAGE_PATH+'/'+image_file_name)
#加载标签
with open(LABEL_PATH+'/'+label_file_name,'r') as f:
point_dict_list_list = json.load(f)['Lines']
for point_dict_list in point_dict_list_list:
random_color = np.random.randint(0,255,3,int).tolist()
last_pos = None
for point_dict in point_dict_list:
pos = (int(eval(point_dict['x'])),int(eval(point_dict['y'])))
cv2.circle(raw_img,pos,5,random_color,-1)
if last_pos != None:cv2.line(raw_img,last_pos,pos,random_color,5)
last_pos = pos
yield cv2.resize(raw_img,(ORIGIN_IMAGE_SIZE[0]//2,ORIGIN_IMAGE_SIZE[1]//2))
if __name__ == "__main__":
for iterator in my_generator():
cv2.imshow('frame',iterator)
cv2.waitKey(0)
用的话直接改IMAGE_PATH和LABEL_PATH就行,标签中的标注点我是用直线连的,你也可以先插值再用自然样条连,但是直线更能体现出标记点数量的合理程度(比如有的曲线只标两个点,用直线连接很明显能看出与原车道不符合)。