将物体检测结果转为xml,降低标注时间

软件环境

windows10 + vs2015 + tinyxml

代码


struct info_box {
	std::string classname;
	cv::Rect box;
	float confidence;
};

int createxml_from_anydetectionmethods(const char* imgfolddir, const char* imgpath, const char* imgname, cv::Mat src, std::vector<info_box>boxes)
{
	
	TiXmlDocument doc;
	/*
	<annotation>
	</annotation>
	*/
	TiXmlElement* root = new TiXmlElement("annotation");
	doc.LinkEndChild(root);

	//<folder> </folder>

	TiXmlElement* folder = new TiXmlElement("folder");
	folder->LinkEndChild(new TiXmlText(imgfolddir));
	root->LinkEndChild(folder);
	
	//<filename> </filename>
	TiXmlElement* filename = new TiXmlElement("filename"); 
	filename->LinkEndChild(new TiXmlText(imgname));
	root->LinkEndChild(filename);
	//<path> </path>
	TiXmlElement* path = new TiXmlElement("path");
	path->LinkEndChild(new TiXmlText(imgpath));
	root->LinkEndChild(path);	
	/*
	<source>
		<database>Unknown</database>
	</source>
	*/
	TiXmlElement* source = new TiXmlElement("source");
	TiXmlElement* database = new TiXmlElement("database");
	database->LinkEndChild(new TiXmlText("Unknown"));
	source->LinkEndChild(database);
	root->LinkEndChild(source);
	/*
	<size>
		<width></width>
		<height></height>
		<depth></depth>
	</size>
	*/
	TiXmlElement* size = new TiXmlElement("size");
	TiXmlElement* width = new TiXmlElement("width");
	TiXmlElement* height = new TiXmlElement("height");
	TiXmlElement* depth = new TiXmlElement("depth");
	width->LinkEndChild(new TiXmlText(std::to_string(src.cols).c_str()));
	height->LinkEndChild(new TiXmlText(std::to_string(src.rows).c_str()));
	depth->LinkEndChild(new TiXmlText(std::to_string(src.channels()).c_str()));
	size->LinkEndChild(width);
	size->LinkEndChild(height);
	size->LinkEndChild(depth);
	root->LinkEndChild(size);

	//<segmented>0</segmented>
	TiXmlElement* segmented = new TiXmlElement("segmented");  
	segmented->LinkEndChild(new TiXmlText("0"));
	root->LinkEndChild(segmented);
	/**
	<object>
		<name></name>
		<pose>Unspecified</pose>
		<truncated>0< / truncated>
		<difficult>0< / difficult>
		<bndbox>
			<xmin>< / xmin>
			<ymin>< / ymin>
			<xmax>< / xmax>
			<ymax>< / ymax>
		</bndbox>
	</object>
	**/
	for (int i=0;i<boxes.size();i++) {

		info_box tmp = boxes[i];

		TiXmlElement* object = new TiXmlElement("object");

		TiXmlElement* name = new TiXmlElement("name");
		name->LinkEndChild(new TiXmlText(tmp.classname.c_str()));

		TiXmlElement* pose = new TiXmlElement("pose");
		pose->LinkEndChild(new TiXmlText("Unspecified"));

		TiXmlElement* truncated = new TiXmlElement("truncated");
		truncated->LinkEndChild(new TiXmlText("0"));

		TiXmlElement* difficult = new TiXmlElement("difficult");
		difficult->LinkEndChild(new TiXmlText("0"));

		int x = tmp.box.x;
		int y = tmp.box.y;
		int h = tmp.box.height;
		int w = tmp.box.width;

		if (x < 0) x = 0;
		if (y < 0) y = 0;
		if (x + w > src.cols)w = src.cols - x;
		if (y + h > src.rows)h = src.rows - y;

		TiXmlElement* bndbox = new TiXmlElement("bndbox");
		TiXmlElement* xmin = new TiXmlElement("xmin");
		xmin->LinkEndChild(new TiXmlText(std::to_string(x).c_str()));
		TiXmlElement* ymin = new TiXmlElement("ymin");
		ymin->LinkEndChild(new TiXmlText(std::to_string(y).c_str()));
		TiXmlElement* xmax = new TiXmlElement("xmax");
		xmax->LinkEndChild(new TiXmlText(std::to_string(x + w).c_str()));
		TiXmlElement* ymax = new TiXmlElement("ymax");
		ymax->LinkEndChild(new TiXmlText(std::to_string(y + h).c_str()));
		bndbox->LinkEndChild(xmin);
		bndbox->LinkEndChild(ymin);
		bndbox->LinkEndChild(xmax);
		bndbox->LinkEndChild(ymax);
		
		object->LinkEndChild(name);
		object->LinkEndChild(pose);
		object->LinkEndChild(truncated);
		object->LinkEndChild(difficult);
		object->LinkEndChild(bndbox);

		root->LinkEndChild(object);
	}
	//std::string savexml = imgname;
	//savexml = "xml\\"+savexml.substr(0, savexml.size() - 3) + "xml";
	//doc.SaveFile(savexml.c_str());
	doc.Clear();
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值