线性标注工具

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: 转换状态 (标记,删除)

鼠标左键 :(标记或删除)

鼠标中键 :(转换标注类型)

发布了77 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_24137739/article/details/87936367