• python实现提取文件名某个字符串并新建文件夹保存,判断两个矩形是否相交或重合


    需求:

    1. 有一批样本集,其中文件的命名格式为:N编号+C类型+P位置信息+S文件名称,和一批图片文件夹(若干jpg文件)。
    2. 先循环遍历图片文件夹,对其进行图像处理操作,得到一系列操作后的结果,保存为npy文件并且保存到新建的文件夹中,命名格式为N编号+P位置信息+S文件名,暂且将它称为数据集吧。
    3. 所以可以发现,样本集和数据集的命名格式就是其实就是相差了类型。这也是接下来要做的。
    4. 首先要提取样本集和数据集的文件名字段,进行匹配,然后找到它们的位置信息(位置信息不是完全一样的,可能是包含关系,就是样本集的矩形框会比数据集大,也有可能是相交,这个是未知的)。一旦文件名匹配成功,位置信息也发现是有重合或者是相交,那就将样本集的类型添加到数据集中,后续会作为模型的标签。

    样本文件名例如: N00001C3noFusionP110_456_45_12S12345.npy

    其中00001为编号,3noFusion为类型,110_456_45_12为位置信息,为x,y,width,height,12345.npy为文件名

     具体实现:

    1、首先就是循环遍历这个图片文件夹,并进行相应的图像处理操作。这个在之前的博客里有写到。接下来就是新建文件夹并将npy文件保存进去。

    1. def save_npy(data,path,name):
    2. '''
    3. data为要保存的npy数据
    4. path为要保存的路径
    5. name为要保存的文件名
    6. '''
    7. if not os.path.exists(path):
    8. os.makedirs(path) #如果没有该文件夹,创建文件夹
    9. file = os.path.join(path,name) #保存文件
    10. if not os.path.isfile(file):
    11. np.save(file,data)
    12. # 所以在主函数中,只需要定义好我们的路径和文件名,调用该函数即可完成新建文件夹和文件的保存。

     到这一步,数据集就搞好了,接下来就是比较头疼的匹配环节。

    2、提取样本集的各字段

    1. # 定义样本集的三个要收集的信息--list
    2. filename_list = []
    3. filetype_list = []
    4. fileposition_list = []
    5. #循环遍历样本集,依次获取三种信息并添加到相应list中
    6. fileList = getFileList(filepath,[],'npy') #这一步是读取样本集中的文件
    7. #它的输出是包含了这个文件的完整路径 比如 D:\\xxxx\\这种的
    8. #所以我们需要提前获取到它的真正文件名
    9. filenameList = []
    10. for item in fileList:
    11. #就是去掉所有的路径前缀,保留文件名
    12. filename = os.path.splitext(os.path.basename(item))[0]
    13. filenameList.append(filename)
    14. #filenameList中存放的就全部都是每一个文件的文件名了
    15. for fileitem in filenameList:
    16. name = fileitem.split('S')[1]
    17. filetype = fileitem.split('C')[1][0:1]
    18. fileposition = fileitem.split('S')[0][-17:].split('P')[1]
    19. filename_list.append(name)
    20. filetype_list.append(filetype)
    21. fileposition_list.append(fileposition)
    22. #至此,样本集的三个信息均收集完成

    具体记录一下提取字符串的split方法

    1. str = '你好,HelloWorld'
    2. b = str.split(',') #这个就是以 ,为分割,划分这个字符串
    3. print(b) # 输出会发现,它是数组,['你好','HelloWorld'] 分别存放分割前和后的字符串
    4. #如果只要逗号后的字符串
    5. c = str.split(',')[1] # HelloWorld

    所以对于文件名就是提取S字符之后的所有字符串就是 split('S')[1]

    而文件的类型,其实我需要的只是C3noFusion里面,C后面紧跟的那个数字即可(共分为1,2,3,三类,每一大类里面有小类,就是后面的英文,但实际中只需要大类即可),所以split('C')[1]就是C后面的所有字段,[0:1]就是该字段中的【0,1)的字段,即那个数字 3

    fileposition写的很复杂,是因为在给文件夹规定命名格式时,是N+C+P+S,但是我一时疏忽忘记考虑在C这个类型里面,第三类有一个小类中包含了P这个字符,C3noPen....这样子的,所以仅通过找到P是不行的。

    1. # N00001C3noFusionP110_456_45_12S12345.npy 以这个命名为例
    2. fileitem.split('S')[0] # N00001C3noFusionP110_456_45_12
    3. # 从后往前找17位,(这里的17是根据命名位置信息P时是超过x,y,width,height所有的长度上限的)
    4. #并且如果有时P字段字符较少,也不会查找到C3noP....中的P字段
    5. # 所以假设查找到了 onP110_456_45_12
    6. 就只需要再split('S')[1]即可

    这里就是完成了文件名中的三个信息的收集工作,后面就是样本集和数据集中位置信息的匹配工作。(位置信息就是外界矩形的左上角的x,y坐标,和它的宽高)。先根据position信息,提取到四个值,存到变量中。如 positon1 = [x,y,width,height] 

    也就是有了两个矩形的位置信息,首先判断它们是否相交,如果相交,判断它们的重合度。

    1. #计算两个矩形是否相交
    2. def mat_inter(box1,box2):
    3. #这里的x01,y01就是左上角的坐标,x02,y02是右下角的坐标
    4. #所以根据我们的x y width height 还要转换一下右下角坐标
    5. x01,y01,x02,y02 = box1
    6. x11,y11,x12,y12 = box2
    7. lx = abs((x01 + x02) / 2 - (x11 + x12) / 2)
    8. ly = abs((y01 + y02) / 2 - (y11 + y12) / 2)
    9. width1 = abs(x01 - x02)
    10. height1 = abs(y01 - y02)
    11. width2 = abs(x11 - x12)
    12. height2 = abs(y11 - y12)
    13. if(lx <= (width1 + width2) / 2 and ly <= (height1 + height2) / 2):
    14. return True
    15. else:
    16. return False
    17. #计算两个矩形框的重合度
    18. def solve_inter(box1,box2):
    19. if mat_inter(box1,box2) == True:
    20. x01,y01,x02,y02 = box1
    21. x11,y11,x12,y12 = box2
    22. col = min(x02,x12) - max(x01,x11)
    23. row = min(y02,y12) - max(y01,y11)
    24. intersection = col * row
    25. area1 = abs(x02 - x01) * abs(y02 - y01)
    26. area2 = abs(x12 - x11) * abs(y12 - y11)
    27. coincide = intersection / (area1 + area2 - intersection)
    28. return coincide
    29. else:
    30. return False

    后续的类型字符段添加还有模型的训练等就不写了

  • 相关阅读:
    力荐,京东首席架构师:亿级流量架构的核心技术文档免费分享
    go1.19正式版 发布了!
    AtCoder Beginner Contest 275 【E】【F】
    vue +vant 封装请求以及不同环境下请求不同的api服务器(三)
    关于信度分析的多种方法
    Linux驱动调试之段错误分析_根据pc值确定出错的代码位置
    秋招面经第三弹:oppo一面-大数据开发工程师
    【软件测试】银行项目,银行测试业务测试,有哪些侧重点?(总结)
    《认知觉醒》读后感
    有了它,让您成为系统搭建高手
  • 原文地址:https://blog.csdn.net/m0_56698268/article/details/126399188