软件环境
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;
}