为啥写这个,这个只是一个小片段,但是如果你能看出来我要干啥,你一定会有一丝涟漪,能理解我要干啥的可以交个朋友!
啥呢?这么神秘?其实就是用C++写了一个xml文件,使用脚本批量生成包围框,做数据呢,假如你知道包围框里是啥,为什么不批量生成数据呢?难道还要用LabelImg一个一个制作?
看代码:
//
string mconIntToString(int number)
{
stringstream ss;
ss<<number;
string snumber = ss.str();
return snumber;
}
int mconStrtoInt(string strnumb)
{
int n = atoi(strnumb.c_str());
return n;
}
typedef struct bndboxobject
{
string name;
int minx;
int miny;
int maxx;
int maxy;
}BNDBOXOBJECT;
typedef std::vector< BNDBOXOBJECT > VecBndboxList;
typedef struct leableobject
{
string folder;
string filename;
string path;
int imagewidth;
int imageheight;
int depth;
VecBndboxList mbndoboxlist;
}LEABLEOBJECT;
int CreatandWreitxml(LEABLEOBJECT mleable )
{
tinyxml2::XMLDocument doc;
// 创建根元素<China>
XMLElement* root = doc.NewElement( "annotation" );
doc.InsertEndChild( root );
// 创建子元素folder
XMLElement* folderElement = doc.NewElement( "folder" );
//cityElement->SetAttribute( "name", "WuHan" ); // 设置元素属性
folderElement->SetText(mleable.folder.c_str());
root->InsertEndChild( folderElement );
//创建子元素filename
XMLElement* filenameElement = doc.NewElement( "filename" );
filenameElement->SetText(mleable.filename.c_str());
root->InsertEndChild( filenameElement );
//创建子元素
XMLElement* pathElement = doc.NewElement( "path" );
pathElement->SetText(mleable.path.c_str());
root->InsertEndChild( pathElement );
// 创建子元素<source>
XMLElement* sourceElement = doc.NewElement( "source" );
//sourceElement->SetAttribute( "name", "WuHan" ); // 设置元素属性
root->InsertEndChild( sourceElement );
// 创建孙元素<database>
XMLElement* databaseElement = doc.NewElement( "database" );
databaseElement->SetText( "Unknown" ); // 设置元素文本
sourceElement->InsertEndChild( databaseElement );
//
// 创建子元素<size>
XMLElement* sizeElement = doc.NewElement( "size" );
//sizeElement->SetAttribute( "name", "WuHan" ); // 设置元素属性
root->InsertEndChild( sizeElement );
// 创建孙元素<width>
XMLElement* widthElement = doc.NewElement( "width" );
widthElement->SetText( mleable.imagewidth ); // 设置元素文本
sizeElement->InsertEndChild( widthElement );
// 创建孙元素<height>
XMLElement* heightElement = doc.NewElement( "height" );
heightElement->SetText( mleable.imageheight ); // 设置元素文本
sizeElement->InsertEndChild( heightElement );
// 创建孙元素<depth>
XMLElement* depthElement = doc.NewElement( "depth" );
depthElement->SetText( mleable.depth ); // 设置元素文本
sizeElement->InsertEndChild( depthElement );
///
//segmented
// 创建子元素<segmented>
XMLElement* segmentedElement = doc.NewElement( "segmented" );
segmentedElement->SetText( 0 ); // 设置元素属性
root->InsertEndChild( segmentedElement );
for(int i=0;i<mleable.mbndoboxlist.size();i++)
{
//string ocrhzname=mconIntToString(i);
//ocrhzname="汉"+ocrhzname;
// 创建子元素<object>
XMLElement* objectElement = doc.NewElement( "object" );
//cityElement->SetAttribute( "name", "WuHan" ); // 设置元素属性
root->InsertEndChild( objectElement );
// 创建孙元素<name>
XMLElement* nameElement = doc.NewElement( "name" );
//nameElement->SetText( "文" ); // 设置元素文本
XMLText* nameText = doc.NewText( mleable.mbndoboxlist[i].name.c_str() );
nameElement->InsertEndChild( nameText ); // 设置元素文本
objectElement->InsertEndChild( nameElement );
// 创建孙元素<pose>
XMLElement* poseElement = doc.NewElement( "pose" );
poseElement->SetText("Unspecified");
objectElement->InsertEndChild( poseElement );
// 创建孙元素<truncated>
XMLElement* truncatedElement = doc.NewElement( "truncated" );
truncatedElement->SetText(0);
objectElement->InsertEndChild( truncatedElement );
// 创建孙元素<difficult>
XMLElement* difficultElement = doc.NewElement( "difficult" );
difficultElement->SetText(0);
objectElement->InsertEndChild( difficultElement );
//bndbox
// 创建孙元素<bndbox>
XMLElement* bndboxElement = doc.NewElement( "bndbox" );
objectElement->InsertEndChild( bndboxElement );
// 创建孙元素<xmin>
XMLElement* xminElement = doc.NewElement( "xmin" );
xminElement->SetText( mleable.mbndoboxlist[i].minx ); // 设置元素文本
bndboxElement->InsertEndChild( xminElement );
// 创建孙元素<ymin>
XMLElement* yminElement = doc.NewElement( "ymin" );
yminElement->SetText( mleable.mbndoboxlist[i].miny ); // 设置元素文本
bndboxElement->InsertEndChild( yminElement );
// 创建孙元素<xmax>
XMLElement* xmaxElement = doc.NewElement( "xmax" );
xmaxElement->SetText( mleable.mbndoboxlist[i].maxx ); // 设置元素文本
bndboxElement->InsertEndChild( xmaxElement );
// 创建孙元素<ymax>
XMLElement* ymaxElement = doc.NewElement( "ymax" );
ymaxElement->SetText(mleable.mbndoboxlist[i].maxy); // 设置元素文本
bndboxElement->InsertEndChild( ymaxElement );
}
// 输出XML至文件
cout << "output xml to '1.xml'" << endl << endl;
doc.SaveFile( "wtest.xml" );
// 输出XML至内存
cout << "output xml to memory" << endl
<< "--------------------" << endl;
XMLPrinter printer;
doc.Print( &printer );
cout << printer.CStr();
return 0;
}
int loadpaseLeableXmlfile(string filexmlname)
{
tinyxml2::XMLDocument doc;
if ( doc.LoadFile(filexmlname.c_str()) )
{
doc.PrintError();
exit( 1 );
}
// 根元素
XMLElement* scene = doc.RootElement();
//cout << "name:" << scene->Attribute( "name" ) << endl << endl;
LEABLEOBJECT mleable;
XMLElement* folder = scene->FirstChildElement( "folder" );
mleable.folder=folder->GetText();
cout << mleable.folder<<endl;
XMLElement* filename = scene->FirstChildElement( "filename" );
mleable.filename=filename->GetText();
cout << mleable.filename<<endl;
XMLElement* path = scene->FirstChildElement( "path" );
mleable.path=path->GetText();
cout << mleable.path<<endl;
XMLElement* size = scene->FirstChildElement( "size" );
//mleable.path=path->GetText();
if(size)
{
cout << "size"<<endl;
XMLElement* width = size->FirstChildElement( "width" );
mleable.imagewidth=mconStrtoInt(width->GetText());
cout << "width "<<mleable.imagewidth<<endl;
XMLElement* height = size->FirstChildElement( "height" );
mleable.imageheight=mconStrtoInt(height->GetText());
cout << "height "<<mleable.imageheight<<endl;
XMLElement* depth = size->FirstChildElement( "depth" );
mleable.depth=mconStrtoInt(depth->GetText());
cout << "depth "<<mleable.depth<<endl;
}
// 遍历<surface>元素
XMLElement* object = scene->FirstChildElement( "object" );
while (object)
{
// 遍历属性列表
// 遍历子元素
XMLElement* nameChild = object->FirstChildElement("name");
if(nameChild)
{
cout << nameChild->GetText()<<endl;
}
XMLElement* bndboxChild = object->FirstChildElement("bndbox");
if(bndboxChild)
{
XMLElement* minxChild = bndboxChild->FirstChildElement("xmin");
cout << minxChild->GetText()<<endl;
XMLElement* minyChild = bndboxChild->FirstChildElement("ymin");
cout << minyChild->GetText()<<endl;
XMLElement* maxxChild = bndboxChild->FirstChildElement("xmax");
cout << maxxChild->GetText()<<endl;
XMLElement* maxyChild = bndboxChild->FirstChildElement("ymax");
cout << maxyChild->GetText()<<endl;
}
cout << endl;
object = object->NextSiblingElement( "object" );
}
return 0;
}
以上代码就是使用tinyxml 生成voc 深度学习格式的文件,万里长征第一步,猜猜我要对啥进行标注,答对,交朋友!