1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 // By downloading, copying, installing or using the software you agree to this license.
6 // If you do not agree to this license, do not download, install,
7 // copy or use the software.
8 //
9 //
10 // Intel License Agreement
11 // For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2000, Intel Corporation, all rights reserved.
14 // Third party copyrights are property of their respective owners.
15 //
16 // Redistribution and use in source and binary forms, with or without modification,
17 // are permitted provided that the following conditions are met:
18 //
19 // * Redistribution's of source code must retain the above copyright notice,
20 // this list of conditions and the following disclaimer.
21 //
22 // * Redistribution's in binary form must reproduce the above copyright notice,
23 // this list of conditions and the following disclaimer in the documentation
24 // and/or other materials provided with the distribution.
25 //
26 // * The name of Intel Corporation may not be used to endorse or promote products
27 // derived from this software without specific prior written permission.
28 //
29 // This software is provided by the copyright holders and contributors "as is" and
30 // any express or implied warranties, including, but not limited to, the implied
31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
32 // In no event shall the Intel Corporation or contributors be liable for any direct,
33 // indirect, incidental, special, exemplary, or consequential damages
34 // (including, but not limited to, procurement of substitute goods or services;
35 // loss of use, data, or profits; or business interruption) however caused
36 // and on any theory of liability, whether in contract, strict liability,
37 // or tort (including negligence or otherwise) arising in any way out of
38 // the use of this software, even if advised of the possibility of such damage.
39 //
40 //M*/
41
42 /* ////////////////////////////////////////////////////////////////////
43 //
44 // C++ classes for image and matrices
45 //
46 // */
47
48 #include "_cxcore.h"
49
50 /////////////////////////////// CvImage implementation //////////////////////////////////
51
52 static CvLoadImageFunc load_image = 0;
53 static CvLoadImageMFunc load_image_m = 0;
54 static CvSaveImageFunc save_image = 0;
55 static CvShowImageFunc show_image = NULL;
56
57 static bool
icvIsXmlOrYaml(const char * filename)58 icvIsXmlOrYaml( const char* filename )
59 {
60 const char* suffix = strrchr( filename, '.' );
61 return suffix &&
62 (strcmp( suffix, ".xml" ) == 0 ||
63 strcmp( suffix, ".Xml" ) == 0 ||
64 strcmp( suffix, ".XML" ) == 0 ||
65 strcmp( suffix, ".yml" ) == 0 ||
66 strcmp( suffix, ".Yml" ) == 0 ||
67 strcmp( suffix, ".YML" ) == 0 ||
68 strcmp( suffix, ".yaml" ) == 0 ||
69 strcmp( suffix, ".Yaml" ) == 0 ||
70 strcmp( suffix, ".YAML" ) == 0);
71 }
72
73
74 static IplImage*
icvRetrieveImage(void * obj)75 icvRetrieveImage( void* obj )
76 {
77 IplImage* img = 0;
78
79 CV_FUNCNAME( "icvRetrieveImage" );
80
81 __BEGIN__;
82
83 if( CV_IS_IMAGE(obj) )
84 img = (IplImage*)obj;
85 else if( CV_IS_MAT(obj) )
86 {
87 CvMat* m = (CvMat*)obj;
88 CV_CALL( img = cvCreateImageHeader( cvSize(m->cols,m->rows),
89 CV_MAT_DEPTH(m->type), CV_MAT_CN(m->type) ));
90 cvSetData( img, m->data.ptr, m->step );
91 img->imageDataOrigin = (char*)m->refcount;
92 m->data.ptr = 0; m->step = 0;
93 cvReleaseMat( &m );
94 }
95 else if( obj )
96 {
97 cvRelease( &obj );
98 CV_ERROR( CV_StsUnsupportedFormat, "The object is neither an image, nor a matrix" );
99 }
100
101 __END__;
102
103 return img;
104 }
105
106
load(const char * filename,const char * imgname,int color)107 bool CvImage::load( const char* filename, const char* imgname, int color )
108 {
109 IplImage* img = 0;
110
111 CV_FUNCNAME( "CvImage::read" );
112
113 __BEGIN__;
114
115 if( icvIsXmlOrYaml(filename) )
116 {
117 img = icvRetrieveImage(cvLoad(filename,0,imgname));
118 if( (img->nChannels > 1) != (color == 0) )
119 CV_ERROR( CV_StsNotImplemented,
120 "RGB<->Grayscale conversion is not implemented for images stored in XML/YAML" );
121 /*{
122 IplImage* temp_img = 0;
123 CV_CALL( temp_img = cvCreateImage( cvGetSize(img), img->depth, color > 0 ? 3 : 1 ));
124 cvCvtColor( img, temp_img, color > 0 ? CV_GRAY2BGR : CV_BGR2GRAY );
125 cvReleaseImage( &img );
126 img = temp_img;
127 }*/
128 }
129 else
130 {
131 if( load_image )
132 img = load_image( filename, color );
133 else
134 CV_ERROR( CV_StsNotImplemented,
135 "Loading an image stored in such a format requires HigGUI.\n"
136 "Link it to your program and call any function from it\n" );
137 }
138
139 attach( img );
140
141 __END__;
142
143 return img != 0;
144 }
145
146
read(CvFileStorage * fs,const char * mapname,const char * imgname)147 bool CvImage::read( CvFileStorage* fs, const char* mapname, const char* imgname )
148 {
149 void* obj = 0;
150 IplImage* img = 0;
151
152 if( mapname )
153 {
154 CvFileNode* mapnode = cvGetFileNodeByName( fs, 0, mapname );
155 if( !mapnode )
156 obj = cvReadByName( fs, mapnode, imgname );
157 }
158 else
159 obj = cvReadByName( fs, 0, imgname );
160
161 img = icvRetrieveImage(obj);
162 attach( img );
163 return img != 0;
164 }
165
166
read(CvFileStorage * fs,const char * seqname,int idx)167 bool CvImage::read( CvFileStorage* fs, const char* seqname, int idx )
168 {
169 void* obj = 0;
170 IplImage* img = 0;
171 CvFileNode* seqnode = seqname ?
172 cvGetFileNodeByName( fs, 0, seqname ) : cvGetRootFileNode(fs,0);
173
174 if( seqnode && CV_NODE_IS_SEQ(seqnode->tag) )
175 obj = cvRead( fs, (CvFileNode*)cvGetSeqElem( seqnode->data.seq, idx ));
176 img = icvRetrieveImage(obj);
177 attach( img );
178 return img != 0;
179 }
180
181
save(const char * filename,const char * imgname)182 void CvImage::save( const char* filename, const char* imgname )
183 {
184 CV_FUNCNAME( "CvImage::write" );
185 __BEGIN__;
186
187 if( !image )
188 return;
189 if( icvIsXmlOrYaml( filename ) )
190 cvSave( filename, image, imgname );
191 else
192 {
193 if( save_image )
194 save_image( filename, image );
195 else
196 CV_ERROR( CV_StsNotImplemented,
197 "Saving an image in such a format requires HigGUI.\n"
198 "Link it to your program and call any function from it\n" );
199 }
200
201 __END__;
202 }
203
204
write(CvFileStorage * fs,const char * imgname)205 void CvImage::write( CvFileStorage* fs, const char* imgname )
206 {
207 if( image )
208 cvWrite( fs, imgname, image );
209 }
210
211
212
213 /////////////////////////////// CvMatrix implementation //////////////////////////////////
214
CvMatrix(int rows,int cols,int type,CvMemStorage * storage,bool alloc_data)215 CvMatrix::CvMatrix( int rows, int cols, int type, CvMemStorage* storage, bool alloc_data )
216 {
217 if( storage )
218 {
219 matrix = (CvMat*)cvMemStorageAlloc( storage, sizeof(*matrix) );
220 cvInitMatHeader( matrix, rows, cols, type, alloc_data ?
221 cvMemStorageAlloc( storage, rows*cols*CV_ELEM_SIZE(type) ) : 0 );
222 }
223 else
224 matrix = 0;
225 }
226
227 static CvMat*
icvRetrieveMatrix(void * obj)228 icvRetrieveMatrix( void* obj )
229 {
230 CvMat* m = 0;
231
232 CV_FUNCNAME( "icvRetrieveMatrix" );
233
234 __BEGIN__;
235
236 if( CV_IS_MAT(obj) )
237 m = (CvMat*)obj;
238 else if( CV_IS_IMAGE(obj) )
239 {
240 IplImage* img = (IplImage*)obj;
241 CvMat hdr, *src = cvGetMat( img, &hdr );
242 CV_CALL( m = cvCreateMat( src->rows, src->cols, src->type ));
243 CV_CALL( cvCopy( src, m ));
244 cvReleaseImage( &img );
245 }
246 else if( obj )
247 {
248 cvRelease( &obj );
249 CV_ERROR( CV_StsUnsupportedFormat, "The object is neither an image, nor a matrix" );
250 }
251
252 __END__;
253
254 return m;
255 }
256
257
load(const char * filename,const char * matname,int color)258 bool CvMatrix::load( const char* filename, const char* matname, int color )
259 {
260 CvMat* m = 0;
261
262 CV_FUNCNAME( "CvMatrix::read" );
263
264 __BEGIN__;
265
266 if( icvIsXmlOrYaml(filename) )
267 {
268 m = icvRetrieveMatrix(cvLoad(filename,0,matname));
269
270 if( (CV_MAT_CN(m->type) > 1) != (color == 0) )
271 CV_ERROR( CV_StsNotImplemented,
272 "RGB<->Grayscale conversion is not implemented for matrices stored in XML/YAML" );
273 /*{
274 CvMat* temp_mat;
275 CV_CALL( temp_mat = cvCreateMat( m->rows, m->cols,
276 CV_MAKETYPE(CV_MAT_DEPTH(m->type), color > 0 ? 3 : 1 )));
277 cvCvtColor( m, temp_mat, color > 0 ? CV_GRAY2BGR : CV_BGR2GRAY );
278 cvReleaseMat( &m );
279 m = temp_mat;
280 }*/
281 }
282 else
283 {
284 if( load_image_m )
285 m = load_image_m( filename, color );
286 else
287 CV_ERROR( CV_StsNotImplemented,
288 "Loading an image stored in such a format requires HigGUI.\n"
289 "Link it to your program and call any function from it\n" );
290 }
291
292 set( m, false );
293
294 __END__;
295
296 return m != 0;
297 }
298
299
read(CvFileStorage * fs,const char * mapname,const char * matname)300 bool CvMatrix::read( CvFileStorage* fs, const char* mapname, const char* matname )
301 {
302 void* obj = 0;
303 CvMat* m = 0;
304
305 if( mapname )
306 {
307 CvFileNode* mapnode = cvGetFileNodeByName( fs, 0, mapname );
308 if( !mapnode )
309 obj = cvReadByName( fs, mapnode, matname );
310 }
311 else
312 obj = cvReadByName( fs, 0, matname );
313
314 m = icvRetrieveMatrix(obj);
315 set( m, false );
316 return m != 0;
317 }
318
319
read(CvFileStorage * fs,const char * seqname,int idx)320 bool CvMatrix::read( CvFileStorage* fs, const char* seqname, int idx )
321 {
322 void* obj = 0;
323 CvMat* m = 0;
324 CvFileNode* seqnode = seqname ?
325 cvGetFileNodeByName( fs, 0, seqname ) : cvGetRootFileNode(fs,0);
326
327 if( seqnode && CV_NODE_IS_SEQ(seqnode->tag) )
328 obj = cvRead( fs, (CvFileNode*)cvGetSeqElem( seqnode->data.seq, idx ));
329 m = icvRetrieveMatrix(obj);
330 set( m, false );
331 return m != 0;
332 }
333
334
save(const char * filename,const char * matname)335 void CvMatrix::save( const char* filename, const char* matname )
336 {
337 CV_FUNCNAME( "CvMatrix::write" );
338 __BEGIN__;
339
340 if( !matrix )
341 return;
342 if( icvIsXmlOrYaml( filename ) )
343 cvSave( filename, matrix, matname );
344 else
345 {
346 if( save_image )
347 save_image( filename, matrix );
348 else
349 CV_ERROR( CV_StsNotImplemented,
350 "Saving a matrixe in such a format requires HigGUI.\n"
351 "Link it to your program and call any function from it\n" );
352 }
353
354 __END__;
355 }
356
357
write(CvFileStorage * fs,const char * matname)358 void CvMatrix::write( CvFileStorage* fs, const char* matname )
359 {
360 if( matrix )
361 cvWrite( fs, matname, matrix );
362 }
363
364
365
366 CV_IMPL int
cvSetImageIOFunctions(CvLoadImageFunc _load_image,CvLoadImageMFunc _load_image_m,CvSaveImageFunc _save_image,CvShowImageFunc _show_image=NULL)367 cvSetImageIOFunctions( CvLoadImageFunc _load_image, CvLoadImageMFunc _load_image_m,
368 CvSaveImageFunc _save_image, CvShowImageFunc _show_image=NULL )
369 {
370 load_image = _load_image;
371 load_image_m = _load_image_m;
372 save_image = _save_image;
373 show_image = _show_image;
374 return 1;
375 }
376
377
378 /*void main(void)
379 {
380 CvImage a(cvSize(300,200),8,3), b(cvSize(300,200),8,3);
381 CvRNG rng = cvRNG(-1);
382
383 CV_SET_IMAGE_IO_FUNCTIONS();
384
385 cvNamedWindow( "test", 1 );
386 //cvZero( a );
387 cvZero( b );
388 cvRandArr( &rng, a, CV_RAND_UNI, cvScalarAll(0), cvScalarAll(100) );
389 cvCircle( b, cvPoint(100,100), 70, cvScalar(0,255,0), -1, CV_AA, 0 );
390 cvAdd( a, b, a );
391 a.show( "test" );
392
393 cvWaitKey();
394 }*/
395
396 /* End of file. */
397
398