import os
import cv2
import copy as cp
imgFile_name = '/media/guangcui/e41da17b-4bfc-4ee0-892c-b96ac5fdded6/freespace_标注调整/v2/960'
labelFile_name = '/media/guangcui/e41da17b-4bfc-4ee0-892c-b96ac5fdded6/freespace_标注调整/v2/label'
def list_r_c(img_name):
''' .
脑补的部分为1(car_list), 正常为0(road_list)
现需要修改的部分在road_list中
'''
with open(os.sep.join([labelFile_name,img_name])+'.txt','r')as f:
print(os.sep.join([labelFile_name,img_name])+'.txt')
while True:
line = f.readline()
if line == '':
break
x,y,flag = line.split(' ')
if int(flag) == 0:
road_list.append((int(float(x)*960),int(float(y)*604)))
# road_list = sorted(road_list, key=lambda road_list: car_list[0])
else:
car_list.append((int(float(x)*960),int(float(y)*604)))
# road_list = sorted(car_list, key=lambda car_list: car_list[0])
def deal(event,x,y,flags,param):
global resim,resim_copy,flag_car,flag_delete,pt0,pt1,car_list,road_list
car_list_copy = []
road_list_copy = []
# 如果存在标记文件,将先前的标记结果读取出来,画图,并操作
for list_index in range(len(road_list)):
cv2.circle(resim,(int(road_list[list_index][0]),int(road_list[list_index][1])),2,(255,0,0),1)
if len(road_list) > 1 and list_index < len(road_list) - 1:
resim = cv2.line(resim,(int(road_list[list_index][0]),int(road_list[list_index][1])),
(int(road_list[list_index + 1][0]),int(road_list[list_index + 1][1])),(255,0,0),1)
for list_index in range(len(car_list)):
cv2.circle(resim,(int(car_list[list_index][0]),int(car_list[list_index][1])),2,(0,255,0),1)
if len(car_list) > 1 and list_index < len(car_list) - 1:
resim = cv2.line(resim,(int(car_list[list_index][0]),int(car_list[list_index][1])),
(int(car_list[list_index + 1][0]),int(car_list[list_index + 1][1])),(0,255,0),1)
if not flag_delete:
if event == cv2.EVENT_LBUTTONDOWN:
if flag_car or (len(road_list)==0 and len(car_list)== 0):
resim = cv2.circle(resim,(x,y),2,(255,0,0),1)
car_list.append((x,y))
index_car = len(car_list)
if index_car > 1:
resim = cv2.line(resim, (int(car_list[index_car - 2][0]), int(car_list[index_car - 2][1])),
(int(car_list[index_car - 1][0]), int(car_list[index_car -1][1] )), (255, 0, 0), 1)
if flag_car == False:
resim = cv2.circle(resim,(x,y),3,(255,0,0),1)
road_list.append((x,y))
index_road = len(road_list)
if index_road > 1:
resim =cv2.line(resim, (int(road_list[index_road - 2][0]),int(road_list[index_road - 2][1])),
(int(road_list[index_road -1][0]),int(road_list[index_road -1][1])),(255,0,0),1)
# 按下鼠标中间键
elif event == cv2.EVENT_MBUTTONDOWN:
flag_car = not flag_car
print('switch to mark road')
else:
# 按下鼠标右键
if event == cv2.EVENT_LBUTTONDOWN:
# 左上
pt0 = (x,y)
elif event == cv2.EVENT_MOUSEMOVE:
# 右下
pt1 = (x,y)
elif event == cv2.EVENT_LBUTTONUP:
# resim = cp.deepcopy(resim_copy)
pt1 = (x,y)
cv2.rectangle(resim,pt0,pt1,(0,0,255),1)
if (flag_car == True and len(car_list) > 0):
print('before_len(car_list)', len(car_list))
for x,y in car_list:
# print(car_list)
if x in range(pt0[0],pt1[0]) and y in range(pt0[1],pt1[1]):
print('drop car mark point!')
continue
else:
car_list_copy.append((x,y))
car_list = car_list_copy
print('after_len(car_list=)', len(car_list))
if (len(road_list) == 0 and flag_car == False):
print('before_len(car_list)', len(car_list))
for x, y in car_list:
# print(car_list)
if x in range(pt0[0], pt1[0]) and y in range(pt0[1], pt1[1]):
print('drop car mark point!')
continue
else:
car_list_copy.append((x,y))
car_list = car_list_copy
print('after_len(car_list=)', len(car_list))
# 删除 车道线数据标注点
if flag_car == False:
print('before_len(road_list)', len(road_list))
for x, y in road_list:
if x in range(pt0[0], pt1[0]) and y in range(pt0[1], pt1[1]):
print('drop road mark point!')
continue
else:
road_list_copy.append((x,y))
road_list = road_list_copy
print('after_len(road_list=)', len(road_list))
def mk_list(path):
img_list = os.listdir(path)
with open(os.sep.join([path,'list.txt']),'w')as f:
for img in img_list:
f.write(img+'\n')
if __name__ == '__main__':
mk_list(imgFile_name)
imgname_list = []
# 获取图片的相对路径
with open(imgFile_name+'/list.txt','r')as f:
while True:
line = f.readline()
line = line.strip('\n')
if not line:
break
imgname_list.append(line)
i = 0
imgname = imgname_list[i]
# 创建窗口
cv2.namedWindow('freeSpaceUpdate',cv2.WINDOW_NORMAL)
# 鼠标触发回调函数
cv2.setMouseCallback('freeSpaceUpdate',deal)
global resim ,resim_copy,flag_car,flag_delete,pt0,pt1,car_list,road_list
flag_delete = False
flag_car = True
pt0 = None
pt1 = None
# 车辆标注点列表
car_list = []
# 车道标注点列表
road_list = []
resim = cv2.imread(imgFile_name + '/' + imgname, 1)
if resim is None:
print('image is not found!')
resim_copy = cp.deepcopy(resim)
imgNameHead = imgname.split('.')[0]
if os.path.exists(labelFile_name + '/' + imgNameHead + '.txt'):
list_r_c(imgNameHead)
while True:
cv2.imshow('freeSpaceUpdate',resim)
# 在窗口操作
if cv2.waitKey(100) & 0xFF == 32: # 空格键
'''
空格键保存 ,清空列表,为下一次存储做准备
注意此处写入如果是追加效果,点数过多会占用太多cpu
'''
imgNameHead = imgname.split('.')[0]
with open (labelFile_name + '/' + imgNameHead + '.txt','w')as f:
for list_index in range(len(car_list)):
f.write(str(car_list[list_index][0]/960)+' '+str(car_list[list_index][1]/604)+' '+'1'+'\n')
for list_index in range(len(road_list)):
f.write(str(road_list[list_index][0]/960)+' '+str(road_list[list_index][1]/604)+' '+'0'+'\n')
print('Finish save mark point file!')
del car_list[:]
del road_list[:]
# i:图片列表索引值
i = i + 1
imgname = imgname_list[i]
resim = cv2.imread(imgFile_name + '/' + imgname, 1)
imgNameHead = imgname.split('.')[0]
# 读取原来输出文件中的信息放在car_list 或 road_list 中
if os.path.exists(labelFile_name + '/' + imgNameHead + '.txt'):
print(labelFile_name+'/'+imgNameHead+'.txt')
list_r_c(imgNameHead)
resim_copy = cv2.imread(str(imgFile_name)+'/'+imgname[i])
if resim is None:
print('Image Is Not Found!')
resim_copy = cp.deepcopy(resim)
elif cv2.waitKey(100) & 0xFF == 27:
cv2.destroyAllWindows()
exit()
elif cv2.waitKey(100) & 0xFF == 44:
i = i - 1
del car_list[:]
del road_list[:]
imgname = imgname_list[i]
resim = cv2.imread(imgFile_name + '/' + imgname, 1)
resim_copy = cp.deepcopy(resim)
imgNameHead = imgname.split('.')[0]
if os.path.exists(labelFile_name + '/' + imgNameHead + '.txt'):
list_r_c(imgNameHead)
elif cv2.waitKey(100) & 0xFF == 46:
i = i + 1
del car_list[:]
del road_list[:]
imgname = imgname_list[i]
resim = cv2.imread(imgFile_name + '/' + imgname, 1)
resim_copy = cp.deepcopy(resim)
imgNameHead = imgname.split('.')[0]
if os.path.exists(labelFile_name + '/' + imgNameHead + '.txt'):
list_r_c(imgNameHead)
elif cv2.waitKey(100) & 0xFF == 120:
flag_delete = not flag_delete
# 释放所有窗口
cv2.destroyAllWindows()
readme:
空格键: 保存
< : 上一张
>: 下一张
esc: 退出
x: 转换状态 (标记,删除)
鼠标左键 :(标记或删除)
鼠标中键 :(转换标注类型)