《学习OpenCV》练习题第三章第八题b

  1 #include <highgui.h>
  2 #include <cv.h>
  3 #include <stdio.h>
  4 
  5 #pragma comment (lib,"opencv_calib3d231d.lib")
  6 #pragma comment (lib,"opencv_contrib231d.lib")
  7 #pragma comment (lib,"opencv_core231d.lib")
  8 #pragma comment (lib,"opencv_features2d231d.lib")
  9 #pragma comment (lib,"opencv_flann231d.lib")
 10 #pragma comment (lib,"opencv_gpu231d.lib")
 11 #pragma comment (lib,"opencv_haartraining_engined.lib")
 12 #pragma comment (lib,"opencv_highgui231d.lib")
 13 #pragma comment (lib,"opencv_imgproc231d.lib")
 14 #pragma comment (lib,"opencv_legacy231d.lib")
 15 #pragma comment (lib,"opencv_ml231d.lib")
 16 #pragma comment (lib,"opencv_objdetect231d.lib")
 17 #pragma comment (lib,"opencv_ts231d.lib")
 18 #pragma comment (lib,"opencv_video231d.lib")
 19 
 20 /*
 21  *《学习OpenCV》第三章第八题b
 22  * 完成时间:19:46 4/4 星期四 2013
 23  */
 24 
 25 #define ARRAY_LENGTH 10    // 数组长度
 26 
 27 typedef struct my_struct
 28 {
 29     int i;
 30     CvPoint point;
 31     CvRect rect;
 32 } MyStruct;
 33 
 34 void write_my_struct(CvFileStorage * fs, const char* name, my_struct*  ms)
 35 {
 36     //开始写数据
 37     cvStartWriteStruct(fs, name, 6);
 38 
 39     //写入一个 整数
 40     cvStartWriteStruct(fs,"integer",CV_NODE_SEQ);
 41     cvWriteInt(fs,NULL,ms->i);
 42     cvEndWriteStruct(fs);
 43 
 44     //写入cvpoint结构
 45     cvStartWriteStruct(fs,"CvPoint",CV_NODE_SEQ);
 46     cvWriteInt(fs,NULL,ms->point.x);
 47     cvWriteInt(fs,NULL,ms->point.y);
 48     cvEndWriteStruct(fs);
 49     
 50     //写入rect结构体
 51     cvStartWriteStruct(fs,"CvRect",CV_NODE_SEQ);
 52     cvWriteInt(fs,NULL,ms->rect.x);
 53     cvWriteInt(fs,NULL,ms->rect.y);
 54     cvWriteInt(fs,NULL,ms->rect.height);
 55     cvWriteInt(fs,NULL,ms->rect.width);
 56     cvEndWriteStruct(fs);
 57      
 58     //结束写数据
 59     cvEndWriteStruct(fs);
 60 }
 61 
 62 void read_my_struct(CvFileStorage* fs, CvFileNode* ms_node, my_struct* ms)
 63 {
 64     // 读第一个整数
 65     // 注意:这里应使用node->data.i的value来读取Integer
 66     int i = cvGetFileNodeByName(fs, ms_node, "integer")->data.i;
 67     ms->i = i;
 68 
 69     // 读CvPoint结构
 70     CvSeq *s1 = cvGetFileNodeByName(fs, ms_node, "CvPoint")->data.seq;
 71     CvPoint point;
 72     point.x= cvReadInt((CvFileNode*)cvGetSeqElem(s1,0));
 73     point.y= cvReadInt((CvFileNode*)cvGetSeqElem(s1,1));
 74     ms->point = point;
 75 
 76     // 读取CvRect结构
 77     CvSeq *s2 = cvGetFileNodeByName(fs, ms_node, "CvRect")->data.seq;
 78     CvRect rect;
 79     rect.x=cvReadInt((CvFileNode*)cvGetSeqElem(s2, 0));
 80     rect.y=cvReadInt((CvFileNode*)cvGetSeqElem(s2, 1));
 81     rect.width=cvReadInt((CvFileNode*)cvGetSeqElem(s2, 3));
 82     rect.height=cvReadInt((CvFileNode*)cvGetSeqElem(s2, 2));
 83     ms->rect = rect;
 84 }
 85 
 86 // 将MyStruct的值显示出来
 87 void ShowStructValue(MyStruct* pvalue)
 88 {
 89     printf("integer:%d\n", pvalue->i);
 90     printf("CvPoint: (%d, %d)\n", pvalue->point.x, pvalue->point.y );
 91     printf("CvRect: h-->%d\tw-->%d\t(%d, %d)\n", pvalue->rect.height, 
 92         pvalue->rect.width, pvalue->rect.x, pvalue->rect.y);
 93 }
 94 
 95 // 检查两个MyStruct是否一致
 96 bool check(MyStruct* msValue1, MyStruct* msValue2)
 97 {
 98     if( (msValue1->i == msValue2->i) && 
 99         (msValue1->point.x == msValue2->point.x) &&
100         (msValue1->point.y == msValue2->point.y) && 
101         (msValue1->rect.height == msValue2->rect.height) && 
102         (msValue1->rect.width == msValue2->rect.width) && 
103         (msValue1->rect.x == msValue2->rect.x) && 
104         (msValue1->rect.y == msValue2->rect.y) )
105         return true;
106     else 
107         return false;
108 }
109 
110 int main()
111 {
112     /* 写数据部分 */
113     MyStruct msArray[ARRAY_LENGTH];
114 
115     CvFileStorage* fs = cvOpenFileStorage("My_struct.xml", 0, CV_STORAGE_WRITE);
116     char pchTag[12]; 
117     // 随机生成数据
118     for(int i = 0; i < ARRAY_LENGTH; i++)
119     {
120         CvRNG rng = cvRNG(cvGetTickCount());
121         
122         msArray[i].i = cvRandInt(&rng) % 256;
123         msArray[i].point = cvPoint( cvRandInt(&rng) % 1000, cvRandInt(&rng) % 1000);
124         msArray[i].rect = cvRect( cvRandInt(&rng) % 1000, cvRandInt(&rng) % 1000,
125             cvRandInt(&rng) % 600, cvRandInt(&rng) % 600 );
126 
127         // 最后一个整数计数
128         sprintf( pchTag, "my_struct_%d", i );
129         write_my_struct(fs, pchTag, &msArray[i]);
130     }
131 
132     cvReleaseFileStorage(&fs);
133 
134     /* 读数据部分 */
135     fs = cvOpenFileStorage("My_struct.xml", NULL, CV_STORAGE_READ );
136     MyStruct msArrayRead[ARRAY_LENGTH];
137      CvFileNode *pnode; 
138 
139     for(int i = 0; i < ARRAY_LENGTH; i++)
140     {
141         sprintf( pchTag, "my_struct_%d", i );
142         pnode = cvGetFileNodeByName(fs, NULL, pchTag);
143         read_my_struct( fs, pnode, &msArrayRead[i] );
144 
145         // 显示
146         printf("---------------------- %d: Write -------------------------\n", i);
147         ShowStructValue( &msArray[i]);
148         printf("---------------------- %d: Read --------------------------\n", i);
149         ShowStructValue( &msArrayRead[i]);
150         // 检查读写是否一致
151         if(check(&msArray[i], &msArrayRead[i] ))
152         {
153             printf("Consistent?:\tAnswer: True\n");
154         }
155         else
156         {
157             printf("Consistent?:\tAnswer: False\n");
158         }
159         getchar();
160     }
161 
162     cvReleaseFileStorage(&fs); 
163 
164     return 0;
165 }

对应的XML文件:

运行结果:

原文地址:https://www.cnblogs.com/qdsclove/p/3012300.html