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