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文件:
运行结果:

