⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xform.c

📁 opencv下的图像sift特征提取以及匹配
💻 C
📖 第 1 页 / 共 2 页
字号:
}/************************ Local funciton definitions *************************//*Returns a feature's match according to a specified match type@param feat feature@param mtype match type, one of FEATURE_FWD_MATCH, FEATURE_BCK_MATCH, orFEATURE_MDL_MATCH@return Returns feat's match corresponding to mtype or NULL for bad mtype*/static __inline struct feature* get_match( struct feature* feat, int mtype ){	if( mtype == FEATURE_MDL_MATCH )		return feat->mdl_match;	if( mtype == FEATURE_BCK_MATCH )		return feat->bck_match;	if( mtype == FEATURE_FWD_MATCH )		return feat->fwd_match;	return NULL;}/*Finds all features with a match of a specified type and stores pointersto them in an array.  Additionally initializes each matched feature'sfeature_data field with a ransac_data structure.@param features array of features@param n number of features in features@param mtype match type, one of FEATURE_{FWD,BCK,MDL}_MATCH@param matched output as an array of pointers to features with a match ofthe specified type@return Returns the number of features output in matched.*/int get_matched_features( struct feature* features, int n, int mtype,struct feature*** matched ){	struct feature** _matched;	struct ransac_data* rdata;	int i, m = 0;	_matched = calloc( n, sizeof( struct feature* ) );	for( i = 0; i < n; i++ )		if( get_match( features + i, mtype ) )		{			rdata = malloc( sizeof( struct ransac_data ) );			memset( rdata, 0, sizeof( struct ransac_data ) );			rdata->orig_feat_data = features[i].feature_data;			_matched[m] = features + i;			_matched[m]->feature_data = rdata;			m++;		}		*matched = _matched;		return m;}/*Calculates the minimum number of inliers as a function of the number ofputative correspondences.  Based on equation (7) inChum, O. and Matas, J.  Matching with PROSAC -- Progressive Sample Consensus.In <EM>Conference on Computer Vision and Pattern Recognition (CVPR)</EM>,(2005), pp. 220--226.@param n number of putative correspondences@param m min number of correspondences to compute the model in question@param p_badsupp prob. that a bad model is supported by a correspondence@param p_badxform desired prob. that the final transformation returned is bad@return Returns the minimum number of inliers required to guarantee, based	on p_badsupp, that the probability that the final transformation returned	by RANSAC is less than p_badxform*/int calc_min_inliers( int n, int m, double p_badsupp, double p_badxform ){	double pi, sum;	int i, j;	for( j = m+1; j <= n; j++ )	{		sum = 0;		for( i = j; i <= n; i++ )		{			pi = pow( p_badsupp, i - m ) * pow( 1.0 - p_badsupp, n - i + m ) *				gsl_sf_choose( n - m, i - m );			sum += pi;		}		if( sum < p_badxform )			break;	}	return j;}/*Draws a RANSAC sample from a set of features.@param features array of pointers to features from which to sample@param n number of features in features@param m size of the sample@param rng random number generator used to sample@return Returns an array of pointers to the sampled features; the sampled	field of each sampled feature's ransac_data is set to 1*/struct feature** draw_ransac_sample( struct feature** features, int n,									int m, gsl_rng* rng ){	struct feature** sample, * feat;	struct ransac_data* rdata;	int i, x;	for( i = 0; i < n; i++ )	{		rdata = feat_ransac_data( features[i] );		rdata->sampled = 0;	}	sample = calloc( m, sizeof( struct feature* ) );	for( i = 0; i < m; i++ )	{		do		{			x = gsl_rng_uniform_int( rng, n );			feat = features[x];			rdata = feat_ransac_data( feat );		}		while( rdata->sampled );		sample[i] = feat;		rdata->sampled = 1;	}	return sample;}/*Extrancs raw point correspondence locations from a set of features@param features array of features from which to extract points and match	points; each of these is assumed to have a match of type mtype@param n number of features@param mtype match type; if FEATURE_MDL_MATCH correspondences are assumed	to be between each feature's img_pt field and it's match's mdl_pt field,	otherwise, correspondences are assumed to be between img_pt and img_pt@param pts output as an array of raw point locations from features@param mpts output as an array of raw point locations from features' matches*/void extract_corresp_pts( struct feature** features, int n, int mtype,						 CvPoint2D64f** pts, CvPoint2D64f** mpts ){	struct feature* match;	CvPoint2D64f* _pts, * _mpts;	int i;	_pts = calloc( n, sizeof( CvPoint2D64f ) );	_mpts = calloc( n, sizeof( CvPoint2D64f ) );	if( mtype == FEATURE_MDL_MATCH )		for( i = 0; i < n; i++ )		{			match = get_match( features[i], mtype );			if( ! match )				fatal_error( "feature does not have match of type %d, %s line %d",							mtype, __FILE__, __LINE__ );			_pts[i] = features[i]->img_pt;			_mpts[i] = match->mdl_pt;		}	else		for( i = 0; i < n; i++ )		{			match = get_match( features[i], mtype );			if( ! match )				fatal_error( "feature does not have match of type %d, %s line %d",							mtype, __FILE__, __LINE__ );			_pts[i] = features[i]->img_pt;			_mpts[i] = match->img_pt;		}		*pts = _pts;		*mpts = _mpts;}/*For a given model and error function, finds a consensus from a set offeature correspondences.@param features set of pointers to features; every feature is assumed to	have a match of type mtype@param n number of features in features@param mtype determines the match field of each feature against which to	measure error; if this is FEATURE_MDL_MATCH, correspondences are assumed	to be between the feature's img_pt field and the match's mdl_pt field;	otherwise matches are assumed to be between img_pt and img_pt@param M model for which a consensus set is being found@param err_fn error function used to measure distance from M@param err_tol correspondences within this distance of M are added to the	consensus set@param consensus output as an array of pointers to features in the	consensus set@return Returns the number of points in the consensus set*/int find_consensus( struct feature** features, int n, int mtype,				   CvMat* M, ransac_err_fn err_fn, double err_tol,				   struct feature*** consensus ){	struct feature** _consensus;	struct feature* match;	CvPoint2D64f pt, mpt;	double err;	int i, in = 0;	_consensus = calloc( n, sizeof( struct feature* ) );	if( mtype == FEATURE_MDL_MATCH )		for( i = 0; i < n; i++ )		{			match = get_match( features[i], mtype );			if( ! match )				fatal_error( "feature does not have match of type %d, %s line %d",							mtype, __FILE__, __LINE__ );			pt = features[i]->img_pt;			mpt = match->mdl_pt;			err = err_fn( pt, mpt, M );			if( err <= err_tol )				_consensus[in++] = features[i];		}	else		for( i = 0; i < n; i++ )		{			match = get_match( features[i], mtype );			if( ! match )				fatal_error( "feature does not have match of type %d, %s line %d",							mtype, __FILE__, __LINE__ );			pt = features[i]->img_pt;			mpt = match->img_pt;			err = err_fn( pt, mpt, M );			if( err <= err_tol )				_consensus[in++] = features[i];		}	*consensus = _consensus;	return in;}/*Releases memory and reduces code size above@param pts1 an array of points@param pts2 an array of points@param features an array of pointers to features; can be NULL*/static __inline void release_mem( CvPoint2D64f* pts1, CvPoint2D64f* pts2,struct feature** features ){	free( pts1 );	free( pts2 );	if( features )		free( features );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -