16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M/////////////////////////////////////////////////////////////////////////////////////// 26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// By downloading, copying, installing or using the software you agree to this license. 66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// If you do not agree to this license, do not download, install, 76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// copy or use the software. 86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Intel License Agreement 116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved. 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners. 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification, 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met: 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's of source code must retain the above copyright notice, 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer. 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's in binary form must reproduce the above copyright notice, 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer in the documentation 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and/or other materials provided with the distribution. 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * The name of Intel Corporation may not be used to endorse or promote products 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// derived from this software without specific prior written permission. 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed. 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct, 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services; 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability, 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage. 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/ 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_ml.h" 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvDI 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double d; 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} CvDI; 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennint CV_CDECL 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCmpDI( const void* a, const void* b, void* ) 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const CvDI* e1 = (const CvDI*) a; 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const CvDI* e2 = (const CvDI*) b; 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return (e1->d < e2->d) ? -1 : (e1->d > e2->d); 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCreateTestSet( int type, CvMat** samples, 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int num_samples, 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int num_features, 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat** responses, 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int num_classes, ... ) 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat* mean = NULL; 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat* cov = NULL; 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMemStorage* storage = NULL; 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvCreateTestSet" ); 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( samples ) 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *samples = NULL; 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( responses ) 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *responses = NULL; 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( type != CV_TS_CONCENTRIC_SPHERES ) 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsBadArg, "Invalid type parameter" ); 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !samples ) 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsNullPtr, "samples parameter must be not NULL" ); 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !responses ) 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsNullPtr, "responses parameter must be not NULL" ); 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( num_samples < 1 ) 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsBadArg, "num_samples parameter must be positive" ); 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( num_features < 1 ) 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsBadArg, "num_features parameter must be positive" ); 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( num_classes < 1 ) 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsBadArg, "num_classes parameter must be positive" ); 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( type == CV_TS_CONCENTRIC_SPHERES ) 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeqWriter writer; 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeqReader reader; 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat sample; 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvDI elem; 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSeq* seq = NULL; 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, cur_class; 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( *samples = cvCreateMat( num_samples, num_features, CV_32FC1 ) ); 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( *responses = cvCreateMat( 1, num_samples, CV_32SC1 ) ); 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( mean = cvCreateMat( 1, num_features, CV_32FC1 ) ); 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( cvSetZero( mean ) ); 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( cov = cvCreateMat( num_features, num_features, CV_32FC1 ) ); 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( cvSetIdentity( cov ) ); 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /* fill the feature values matrix with random numbers drawn from standard 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn normal distribution */ 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( cvRandMVNormal( mean, cov, *samples ) ); 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /* calculate distances from the origin to the samples and put them 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn into the sequence along with indices */ 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( storage = cvCreateMemStorage() ); 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( cvStartWriteSeq( 0, sizeof( CvSeq ), sizeof( CvDI ), storage, &writer )); 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < (*samples)->rows; ++i ) 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( cvGetRow( *samples, &sample, i )); 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn elem.i = i; 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( elem.d = cvNorm( &sample, NULL, CV_L2 )); 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_WRITE_SEQ_ELEM( elem, writer ); 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( seq = cvEndWriteSeq( &writer ) ); 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /* sort the sequence in a distance ascending order */ 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( cvSeqSort( seq, icvCmpDI, NULL ) ); 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /* assign class labels */ 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn num_classes = MIN( num_samples, num_classes ); 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( cvStartReadSeq( seq, &reader ) ); 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_READ_SEQ_ELEM( elem, reader ); 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0, cur_class = 0; i < num_samples; ++cur_class ) 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int last_idx; 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double max_dst; 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn last_idx = num_samples * (cur_class + 1) / num_classes - 1; 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( max_dst = (*((CvDI*) cvGetSeqElem( seq, last_idx ))).d ); 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn max_dst = MAX( max_dst, elem.d ); 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; elem.d <= max_dst && i < num_samples; ++i ) 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_MAT_ELEM( **responses, int, 0, elem.i ) = cur_class; 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( i < num_samples - 1 ) 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_READ_SEQ_ELEM( elem, reader ); 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cvGetErrStatus() < 0 ) 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( samples ) 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( samples ); 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( responses ) 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( responses ); 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &mean ); 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &cov ); 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMemStorage( &storage ); 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */ 171