Custom VOC label data C++

Why write this? This is just a small snippet, but if you can see what I want to do, you will have a ripple. If you understand what I want to do, you can make friends!

What? So mysterious? In fact, I wrote an xml file in C++, and used a script to generate bounding boxes in batches to make data. If you know what the bounding boxes are, why not generate data in batches? Is it necessary to use LabelImg to make them one by one?

Look at the code:

//


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;
}

The above code is to use tinyxml to generate a voc deep learning format file. The first step in the long march is to guess what I want to mark, answer it correctly, and make friends!

Guess you like

Origin blog.csdn.net/sun19890716/article/details/103260545
Recommended