自定义VOC标签数据C++

为啥写这个,这个只是一个小片段,但是如果你能看出来我要干啥,你一定会有一丝涟漪,能理解我要干啥的可以交个朋友!

啥呢?这么神秘?其实就是用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 深度学习格式的文件,万里长征第一步,猜猜我要对啥进行标注,答对,交朋友!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值