数据结构:
基本数据类型:
CvPoint(,2D32f,3D32f) CvSize(,2D32f) CvScale(four double-precision numbers.) RGBA
CvRect
矩阵和图像类型:
CvArr
|
|
|
CvMat (只是头) (向量也用矩阵来表示,这和Matlab很象) CV_<bit_depth>(S|U|F)C<number_of_channels>说明像素可能不是一个数值
| cvCreateMatHeader() + cvCreateData() cvInitMatHeader(已有头)cvMat(分配头)
| (头+数据) cvCreateMat() cvCloneMat cvReleaseMat
| step的含义:一行所占的字节数 例如 cols=3 type=CV_32FC1 3x32/8x1=12 CV_32FC3 3x32/8x3=36
| cvGetElemType cvGetDims cvGetDimSize(制定维数)
| CV_MAT_ELEM() (已转型) CV_MAT_ELEM_PTR()
|
IplImage depth channels 分离 origin(左上或左下) dataOrder(像素或平面) ROI
构造函数命名规则:
与结构体命名一样,但首字符小写 例外cvRealScalar() [1],cvScalarAll() [1-4]
需要注意的地方:
1.使用step避免四字节存取问题
2.注意1xn,nx1,nx3和3xn的区别
3.IplImage 和CvMat的区别:IplImage数据是BYTE指针 step ,而CvMat是UNION step/n
4.在设置了ROI区域后一定要cvResetImageROI(),否则只显示ROI区域
5.重要公式:imageData +y * widthStep+x*nChannels;
6.cvConvertScale()先Scale再Convert
7.cvMul()进行的是对应点的乘法
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1 //第二章习题:
2
3
4 #include <stdio.h>
5 #include <math.h>
6 #include <time.h>
7 //#include "cxtypes.h"
8 #include "highgui.h" //->cxcore.h->cxtypes.h
9
10 typedef struct _tagmyStuct
11 {
12 int i;
13 CvPoint p;
14 CvRect r;
15
16 }my_struct;
17
18 void write_my_struct( CvFileStorage * fs, const char *name, my_struct *ms)
19 {
20 cvStartWriteStruct( fs, name, CV_NODE_SEQ );
21 cvWriteInt(fs,0,ms->i);
22 cvWriteInt(fs,0,ms->p.x);
23 cvWriteInt(fs,0,ms->p.y);
24 cvWriteInt(fs,0,ms->r.x);
25 cvWriteInt(fs,0,ms->r.y);
26 cvWriteInt(fs,0,ms->r.width);
27 cvWriteInt(fs,0,ms->r.height);
28 cvEndWriteStruct(fs);
29
30 }
31
32 void read_my_struct( CvFileStorage* fs, CvFileNode* ms_node, my_struct* ms )
33 {
34
35 char temp[10];
36 static i;
37 sprintf(temp,"my_struct%d",i);
38 CvSeq* s = cvGetFileNodeByName(fs,0,temp)->data.seq;
39 ms->i = cvReadInt((CvFileNode*)cvGetSeqElem(s,0));
40 ms->p.x = cvReadInt((CvFileNode*)cvGetSeqElem(s,1));
41 ms->p.y = cvReadInt((CvFileNode*)cvGetSeqElem(s,2));
42 ms->r.x = cvReadInt((CvFileNode*)cvGetSeqElem(s,3));
43 ms->r.y = cvReadInt((CvFileNode*)cvGetSeqElem(s,4));
44 ms->r.width = cvReadInt((CvFileNode*)cvGetSeqElem(s,5));
45 ms->r.height = cvReadInt((CvFileNode*)cvGetSeqElem(s,6));
46 i++;
47
48 }
49
50 int main(int argc, char** argv)
51 {
52
53 /*ex_1_1
54 double a=-0.123456;
55 printf("a: %f\n", fabs(a)); //用CV_IABS貌视不行
56 printf("a: %d\n",cvRound(a));
57
58 printf("a: %d\n",cvFloor(a));
59
60 printf("a: %d\n",cvCeil(a));
61 */
62 /*ex_1_2
63 CvRNG rng;
64 srand((unsigned)time(NULL));
65 rng=cvRNG(rand());
66 printf("b: %d\n",cvRandInt(&rng));
67 */
68 /*ex_1_3
69 CvPoint2D32f p;
70 p.x=1.234f;
71 p.y=4.321f;
72 CvPoint p1;
73 p1= cvPointFrom32f(p);
74 printf("p1.x:%d,p1.y:%d\n",p1.x,p1.y);
75 */
76 /*ex_1_4
77 CvPoint2D32f p;
78 CvPoint p1;
79 p1.x=1;
80 p1.y=4;
81 p= cvPointTo32f(p1);
82 printf("p.x:%f,p1.y:%f\n",p.x,p.y);
83 */
84 /*ex_2
85 CvMat* mat;
86 mat=cvCreateMat(100,100,CV_8UC1);
87 cvZero(mat);
88 //a
89 cvCircle( mat, cvPoint(50,50),20, cvScalar(255,255,0));
90 //b
91 cvNamedWindow("SHOW", CV_WINDOW_AUTOSIZE );
92 cvShowImage("SHOW", mat );
93 cvWaitKey(0);
94 cvReleaseMat( &mat );
95 cvDestroyWindow("SHOW");
96 */
97 /*ex_3
98 CvMat* mat;
99 BYTE* green;
100 mat=cvCreateMat(100,100,CV_8UC3);
101 cvZero(mat);
102
103 green=cvPtr2D(mat,0,0);
104 green+=1;
105 *green=255;
106
107 cvRectangle(mat,cvPoint(20,5),cvPoint(40,20),cvScalar(0,255,0));
108 cvNamedWindow("SHOW", CV_WINDOW_AUTOSIZE );
109 cvShowImage("SHOW", mat );
110 cvWaitKey(0);
111 cvReleaseMat( &mat );
112 cvDestroyWindow("SHOW");
113 */
114 /*ex_4
115 CvMat* mat;
116 BYTE* green;
117 mat=cvCreateMat(100,100,CV_8UC3);
118 cvZero(mat);
119
120 for(int row=21;row<40;row++)
121 {
122 *(mat->data.ptr+5*mat->step+row*3+1)=255;
123 *(mat->data.ptr+20*mat->step+row*3+1)=255;
124 }
125
126 for(int col=5;col<21;col++)
127 {
128 *(mat->data.ptr+col*mat->step+20*3+1)=255;
129 *(mat->data.ptr+col*mat->step+40*3+1)=255;
130 }
131
132 cvNamedWindow("SHOW", CV_WINDOW_AUTOSIZE );
133 cvShowImage("SHOW", mat );
134 cvWaitKey(0);
135 cvReleaseMat( &mat );
136 cvDestroyWindow("SHOW");
137 */
138 /*ex_5
139 IplImage* pict;
140 pict=cvCreateImage(cvSize(210,210),IPL_DEPTH_8U,3);
141 cvZero(pict);
142 for(int x=0;x<110;x+=10)
143 {
144
145 cvSetImageROI(pict, cvRect(x,x,210-2*x,210-2*x));
146 cvSet(pict,cvScalar(2*x));
147 cvResetImageROI(pict);
148 }
149
150 cvNamedWindow("SHOW", CV_WINDOW_AUTOSIZE );
151 cvShowImage("SHOW", pict );
152 cvWaitKey(0);
153 cvReleaseImage( &pict );
154 cvDestroyWindow("SHOW");
155 */
156 /*ex_6
157 IplImage* pict;
158 IplImage* pict2;
159 IplImage* pict3;
160 pict=cvLoadImage("fruits.jpg",1);
161 cvNamedWindow("SHOW", CV_WINDOW_AUTOSIZE );
162
163 pict2=cvCreateImageHeader(cvSize(20,30),pict->depth,pict->nChannels);
164
165 pict2->origin=pict->origin;
166 pict2->widthStep=pict->widthStep;
167 pict3=cvCreateImageHeader(cvSize(20,30),pict->depth,pict->nChannels);
168 pict3->origin=pict->origin;
169 pict3->widthStep=pict->widthStep;
170
171 pict2->imageData=(pict->imageData+10*pict->widthStep+5*pict->nChannels);
172 pict3->imageData=(pict->imageData+60*pict->widthStep+50*pict->nChannels);
173
174 cvNot(pict2,pict2);
175 cvNot(pict3,pict3);
176
177 cvShowImage("SHOW", pict );
178 cvWaitKey(0);
179 cvReleaseImage( &pict );
180 cvReleaseImageHeader(&pict2);
181 cvReleaseImageHeader(&pict3);
182 cvDestroyWindow("SHOW");
183 */
184 /*ex_7
185 IplImage* pict;
186
187 IplImage* green;
188 IplImage* clone1;
189 IplImage* clone2;
190
191 double max,min;
192 pict=cvLoadImage("fruits.jpg",1);
193 cvNamedWindow("SHOW", CV_WINDOW_AUTOSIZE );
194
195 green=cvCreateImage(cvSize(pict->width,pict->height),pict->depth,1);
196 clone1=cvCreateImage(cvSize(pict->width,pict->height),pict->depth,1);
197 clone2=cvCreateImage(cvSize(pict->width,pict->height),pict->depth,1);
198 cvSplit(pict,NULL,green,NULL,NULL);
199 cvShowImage("SHOW", green);
200
201 cvCopy(green,clone1);
202 cvCopy(green,clone2);
203
204 cvMinMaxLoc(green,&min,&max);
205
206 cvSet(clone1,cvScalar((max-min)/2));
207 cvZero(clone2);
208
209 cvCmp(green, clone1, clone2, CV_CMP_GE);
210
211 cvSubS(green,cvScalar((max-min)/4),green,clone2);
212
213 cvShowImage("SHOW", green );
214
215 cvWaitKey(0);
216
217 cvReleaseImage( &pict );
218 cvReleaseImage( &green );
219 cvReleaseImage( &clone1 );
220 cvReleaseImage( &clone2 );
221
222 cvDestroyWindow("SHOW");
223
224 */
225 /*ex_8
226 my_struct mst2[10];
227 char temp[10];
228
229 for(int i=0;i<10;i++)
230 {
231 memset(&mst2[i],0,sizeof(my_struct));
232 mst2[i].i=i;
233 }
234
235 CvFileStorage* fs = cvOpenFileStorage("test.xml",0,CV_STORAGE_WRITE);
236
237 for( i=0;i<10;i++)
238 {
239 sprintf(temp,"my_struct%d",i);
240 write_my_struct(fs,temp,&mst2[i]);
241 }
242 cvReleaseFileStorage( &fs );
243
244
245 memset(&mst2[0],0,10*sizeof(my_struct));
246
247 for( i=0;i<10;i++)
248 {
249 printf("i:%d,p:(%d,%d),r:(%d,%d,%d,%d)\n",mst2[i].i,mst2[i].p.x,mst2[i].p.y,mst2[i].r.x,mst2[i].r.y,mst2[i].r.width,mst2[i].r.height);
250 }
251 fs = cvOpenFileStorage(
252 "test.xml",
253 0,
254 CV_STORAGE_READ);
255
256 for( i=0;i<10;i++)
257 {
258 read_my_struct(fs,NULL, & mst2[i] );
259 printf("i:%d,p:(%d,%d),r:(%d,%d,%d,%d)\n",mst2[i].i,mst2[i].p.x,mst2[i].p.y,mst2[i].r.x,mst2[i].r.y,mst2[i].r.width,mst2[i].r.height);
260 }
261
262 cvReleaseFileStorage( &fs );
263 */
264 }
265
266 //其中第8题写的极其丑陋,对Persistance 理解不够,望有高手能指正
267
268