我有85张26*7的二进制图像,这些图像将用于训练系统。我试图在XML中将这些图像的每个Mat一个接一个地写入,并全部放在同一个元素名称*Training_set*中,如下所示:
<?xml version="1.0"?><opencv_storage><Training_set type_id="opencv-matrix"> Mat1 values Mat2 values Mat3 values ...... Mat85 values</Training_set ></opencv_storage>
我使用了以下代码:
FileStorage fs("Samples.xml", FileStorage::WRITE);// Check if we actually created the fileif(fs.isOpened()){ IplImage *img = cvLoadImage("eye1.bmp"); Mat imgg=cvarrToMat(img); fs <<"Training_set"<< imgg; IplImage *img2 = cvLoadImage("eye2.bmp"); Mat imgg2=cvarrToMat(img2); fs <<"Trainging_set"<<imgg2;}
目前,我得到的结果是:
<?xml version="1.0"?> <opencv_storage> <Training_set type_id="opencv-matrix"> Mat1 values </Training_set > <Training_set type_id="opencv-matrix"> Mat2 values </Training_set > </opencv_storage>
如您所见,它们被分配到同一个元素名称下,但却是*分开的*。这并不是我想要的结果。我如何才能在同一个元素名称下以*单一批次*的方式写入所有Mat值?
这个XML文件将包含用于神经网络的训练样本集,该网络是使用Visual Studio C++在Opencv中开发的。
回答:
这些帧被合并在一起,然后写入XML文件。请参考链接 http://devblog.michalski.im/2012/05/18/combine-multiple-video-frames-into-one-using-opencv/
首先,我们创建一个Mat来存储所有图像,我称之为Merged_frame。
Mat Merged_frame =Mat(Size(26,595), CV_8UC3);
Merged_frame的大小取决于用于训练的图像大小和图像数量。我的x=26是因为图像是26*7…26列和7行。我们垂直地一个接一个地存储85张图像,因此行数将是7*85。
我开发的用于合并图像的代码片段如下:
IplImage *img = cvLoadImage("X1.bmp"); Mat im=cvarrToMat(img); roi = Mat(Merged_frame, Rect(0,0,26,7)); //Sets region of interest im.copyTo(roi);
我对每张图像都这样做,记得相应地更改Rect(x,y,width,height)参数。这将把图像存储在Merged_frame中找到的特定位置。
在存储每张图像后,我们可以将Merged_frame发送到XML文件中。
我达到了我需要的结果,希望这对像我这样的图像处理新手有所帮助。:) 祝好运!!!