#-*- coding:utf-8 -*-
import os, glob
import cv2
from scipy.io import loadmat
from collections import defaultdict
import numpy as np
from lxml import etree, objectifydef vbb_anno2dict(vbb_file, cam_id):#通过os.path.basename获得路径的最后部分“文件名.扩展名”#通过os.path.splitext获得文件名filename = os.path.splitext(os.path.basename(vbb_file))[0]#定义字典对象annosannos = defaultdict(dict)vbb = loadmat(vbb_file)# object info in each frame: id, pos, occlusion, lock, posvobjLists = vbb['A'][0][0][1][0]objLbl = [str(v[0]) for v in vbb['A'][0][0][4][0]]     #可查看所有类别        # person indexperson_index_list = np.where(np.array(objLbl) == "person")[0]   #只选取类别为‘person’的xmlfor frame_id, obj in enumerate(objLists):if len(obj) > 0:frame_name = str(cam_id) + "_" + str(filename) + "_" + str(frame_id+1) + ".jpg"annos[frame_name] = defaultdict(list)annos[frame_name]["id"] = frame_nameannos[frame_name]["label"] = "person"for id, pos, occl in zip(obj['id'][0], obj['pos'][0], obj['occl'][0]):id = int(id[0][0]) - 1  # for matlab start from 1 not 0if not id in person_index_list:  # only use bbox whose label is personcontinuepos = pos[0].tolist()occl = int(occl[0][0])annos[frame_name]["occlusion"].append(occl)annos[frame_name]["bbox"].append(pos)if not annos[frame_name]["bbox"]:del annos[frame_name]print (annos)return annosdef seq2img(annos, seq_file, outdir, cam_id):cap = cv2.VideoCapture(seq_file)index = 1# captured frame listv_id = os.path.splitext(os.path.basename(seq_file))[0]cap_frames_index = np.sort([int(os.path.splitext(id)[0].split("_")[2]) for id in annos.keys()])while True:ret, frame = cap.read()print (ret)if ret:if not index in cap_frames_index:index += 1continueif not os.path.exists(outdir):os.makedirs(outdir)outname = os.path.join(outdir, str(cam_id)+"_"+v_id+"_"+str(index)+".jpg")print ("Current frame: ", v_id, str(index))cv2.imwrite(outname, frame)height, width, _ = frame.shapeelse:breakindex += 1img_size = (width, height)return img_sizedef instance2xml_base(anno, bbox_type='xyxy'):"""bbox_type: xyxy (xmin, ymin, xmax, ymax); xywh (xmin, ymin, width, height)"""assert bbox_type in ['xyxy', 'xywh']E = objectify.ElementMaker(annotate=False)anno_tree = E.annotation(E.folder('VOC2014_instance/person'),E.filename(anno['id']),E.source(E.database('Caltech pedestrian'),E.annotation('Caltech pedestrian'),E.image('Caltech pedestrian'),E.url('None')),E.size(E.width(640),E.height(480),E.depth(3)),E.segmented(0),)for index, bbox in enumerate(anno['bbox']):bbox = [float(x) for x in bbox]if bbox_type == 'xyxy':xmin, ymin, w, h = bboxxmax = xmin+wymax = ymin+helse:xmin, ymin, xmax, ymax = bboxE = objectify.ElementMaker(annotate=False)anno_tree.append(E.object(E.name(anno['label']),E.bndbox(E.xmin(xmin),E.ymin(ymin),E.xmax(xmax),E.ymax(ymax)),E.difficult(0),E.occlusion(anno["occlusion"][index])))return anno_treedef parse_anno_file(vbb_inputdir,vbb_outputdir):# annotation sub-directories in hda annotation input directoryassert os.path.exists(vbb_inputdir)sub_dirs = os.listdir(vbb_inputdir)     #对应set00,set01...for sub_dir in sub_dirs:print ("Parsing annotations of camera: ", sub_dir)cam_id = sub_dir#获取某一个子set下面的所有vbb文件vbb_files = glob.glob(os.path.join(vbb_inputdir, sub_dir, "*.vbb")) for vbb_file in vbb_files:#返回一个vbb文件中所有的帧的标注结果annos = vbb_anno2dict(vbb_file, cam_id)if annos:#组成xml文件的存储文件夹,形如“/Users/chenguanghao/Desktop/Caltech/xmlresult/”vbb_outdir = vbb_outputdir#如果不存在if not os.path.exists(vbb_outdir):os.makedirs(vbb_outdir)for filename, anno in sorted(annos.items(), key=lambda x: x[0]):                  if "bbox" in anno:anno_tree = instance2xml_base(anno)outfile = os.path.join(vbb_outdir, os.path.splitext(filename)[0]+".xml")print ("Generating annotation xml file of picture: ", filename)#生成最终的xml文件,对应一张图片etree.ElementTree(anno_tree).write(outfile, pretty_print=True)
def visualize_bbox(xml_file, img_file):import cv2tree = etree.parse(xml_file)# load imageimage = cv2.imread(img_file)origin =  cv2.imread(img_file)# 获取一张图片的所有bboxfor bbox in tree.xpath('//bndbox'):coord = []for corner in bbox.getchildren():coord.append(int(float(corner.text)))print (coord)cv2.rectangle(image, (coord[0], coord[1]), (coord[2], coord[3]), (0, 0, 255), 2)# visualize imagecv2.imshow("test", image)cv2.imshow('origin', origin)cv2.waitKey(0)def main():vbb_inputdir = "C:/Users/dell/Desktop/annotations"vbb_outputdir = "C:/Users/dell/Desktop/annotations"parse_anno_file(vbb_inputdir, vbb_outputdir)"""下面这段是测试代码""""""xml_file = "/Users/chenguanghao/Desktop/Caltech/xmlresult/set07/bbox/set07_V000_4.xml"img_file = "/Users/chenguanghao/Desktop/Caltech/JPEG/set07/V000/4.jpg"visualize_bbox(xml_file, img_file)"""
if __name__ == "__main__":main()

将VBB文件转换成XML文件相关推荐

  1. Java实现从Excel文件转换成XML文件(一)

    实现思路:         直接从Excel文件装换成XML文件是可以实现的,这里我采用一个中间装换,也就是先实现excel文件内容放入实现设计好的access数据库文件中,然后再从access中读取 ...

  2. Java方法excel文件转换成xml文件

    excel转xml文件其实是很简单的,主要在于你要知道怎么去解决这个业务上的流程,那我们应该知道一点的是:我们必须把数据先从excel中读出来,然后对这些数据进行xml格式的封装.这样我们就很容易解决 ...

  3. python 怎么样去txt中提取xml_如何使用python将.txt文件转换成xml文件?

    尝试以下代码作为启动程序:#!python3 import re import xml.etree.ElementTree as ET rex = re.compile(r'''(?P Longitu ...

  4. Linux把日志文件转换成xml,[转载]将 HTML 文件转换成 XML

    在 Java 专家 Michael Geisler 为 Builder 澳大利亚写的第一篇文章中,他向读者展示了如何使用 JTidy 将 HTML 文件转换成 XML. 有关 Java 的最重要的事情 ...

  5. Java使用aspse实现Excel文件转换成PDF文件

    使用Java代码把Excel文件转换成PDF文件 需要引用aspose包,引入操作我写了一个博客,地址如下 https://blog.csdn.net/weixin_46713508/article/ ...

  6. Java使用aspose把PDF文件转换成PNG文件,以及把PDF文件水印转换成PNG格式

    Java代码把PDF文件转换成PNG文件 需要引用aspose包,引入操作我写了一个博客,地址如下 https://blog.csdn.net/weixin_46713508/article/deta ...

  7. python将txt转换为csv_Python Pandas 三行代码将 txt 文件转换成 csv 文件

    今天需要处理几个比较大的 txt 文件,每个文件都在 2GB 以上,直接用 Excel 将其转换成 csv 文件显然是不太可行的,于是用 Python 中的数据处理神器 Pandas,三行代码就能搞定 ...

  8. bat脚本中获取上级目录_使用Python写一个可以监控Tomcat 运行的脚本,并且把.py文件转换成.exe文件...

    使用Python写一个可以监控Tomcat 运行的脚本,并且把.py文件转换成.exe文件 文章来源与博主本人的CSDN博客,博客地址:https://blog.csdn.net/weixin_435 ...

  9. csv文件转换成xlsx文件方法

    背景: 在实际工作中,我们经常会面对大批量的数据进行处理,其中将csv文件文件转换成xlsx文件就是其中的一项,废话少说,上家伙: 一般方法: 将csv文件另存为xlsx文件: 但实际中03版本(.x ...

  10. 如何将Ai文件转换成PDF文件

    要将Ai文件转换成PDF文件,请按照以下步骤操作: 1. 打开客汇宝网站软件并打开要转换的文件. 2. 点击"文件"菜单并选择"另存为". 3. 在" ...

最新文章

  1. 明晚8点公开课 | 用AI给旧时光上色!详解GAN在黑白照片上色中的应用
  2. Ubuntu下非常给力的下载工具–aira2
  3. Leetcode 40组合总数(回溯)Ⅱ41缺失的第一个正数42接雨水
  4. solr配置同义词,停止词,和扩展词库(IK分词器为例)
  5. 手机连接投影机的步骤_投影机安装过程详解
  6. 基于Docker快速搭建ELK
  7. opencv HOG SVM 二
  8. python使用ip代理抓取网页
  9. 泰山游记:厕所竟然没水,可想而知
  10. 滑动拼图验证码的原理和破解方法~
  11. 电感的作用和工作原理
  12. 显卡驱动卸载工具DDU
  13. VC++课程设计常见问题解答
  14. 简单 html 分页标签
  15. 读《MacTalk#183;人生元编程》及Mac经常使用软件
  16. 百度云虚拟主机bch 重定向
  17. VMSB200A16自定义组织功能配置指导
  18. LIS检验管理系统源码 医院管理系统源码
  19. 【redis前传】集思广益之quicklist,取其精华去其糟粕
  20. 混合开发框架的对比,Flutter更胜一筹?

热门文章

  1. 世界3大IT服务品牌之一塔塔咨询服务公司发布新品牌宣言
  2. 最牛的支付渠道-“代扣”
  3. java 视频处理_java使用ffmpeg处理视频的方法
  4. Win10电脑网络图标不见了 解决办法
  5. 性能测试方案(计划)模板
  6. zepto获取html内容,基于Zepto的内容滑动插件:zepto.hwSlider.js
  7. SAP常用TCODE
  8. 【阿里巴巴Java编程规范学习 四】Java质量安全规约
  9. win7藏文打印部分文字乱码问题处理
  10. 区块链软件公司:区块链的不可篡改贴合司法存证需求