コード例 #1
0
bool OptimizationRANSAC::run(const cv::Mat& m1, const cv::Mat& m2, 
			cv::Mat& model, cv::Mat& mask,
			const double reproj_threshold, const double confidence, 
			const int max_iters )
{
	bool result = false;
	const int count = m1.rows;
	int good_count_max = 0;
	std::vector<int> subset_idx;

	cv::Mat model_tmp;
	cv::Mat err(count, 1, CV_64F);
	cv::Mat tmask(count, 1, CV_8UC1);
	mask.create(count, 1, CV_8UC1);

	int niters = max_iters;
	for( int iter = 0; iter < niters; iter++ )
	{
		int good_count;
		if( count > num_model_points )
		{
			subset_idx.clear();
			bool found = getSubset( m1, m2, subset_idx );
			if( !found )
			{
				if( iter == 0 )
					return false;
				break;
			}
		}

		fitSubset(m1, m2, subset_idx, model_tmp);

		good_count = findInliers( m1, m2, model_tmp, err, tmask, reproj_threshold );
		if (good_count > good_count_max && good_count > num_model_points)
		{
			std::swap(tmask, mask);
			model_tmp.copyTo(model);
			good_count_max = good_count;
			niters = RANSACUpdateNumIters( confidence,
				(double)(count - good_count)/count, num_model_points, niters );
		}
	}

	if (good_count_max>0)
	{
		result = true;
	}

	return result;
}
コード例 #2
0
ファイル: ransac.c プロジェクト: matheusota/AI-Assignments
//implementation of the ransac algorithm
void ransac(){
	int i, j, k = 0, index_p1, index_p2, n_inliers = 0, n_inliers2;
	float slope, intercept;
	point inliers[1000], inliers2[1000];
	segment segTemp1, segTemp2;
	
	while(n_data >= 8){
		segments[n_segments].n_inliers = 0;
		
		//try to find a segment to different models
		for(i = 0; i < 500; i++){
			//get 2 random points of the data set
			index_p1 = getRandomPoint();
			index_p2 = getRandomPoint();
			while(index_p1 == index_p2 || data[index_p2].x == data[index_p1].x)
				index_p2 = getRandomPoint();
			
			//fit the model
			slope = (data[index_p2].y - data[index_p1].y) / (data[index_p2].x - data[index_p1].x);
			intercept = data[index_p1].y - (slope * data[index_p1].x); 
			
			//find the inliers
			findInliers(slope, intercept, inliers, &n_inliers);
			
			//find the biggest segment
			segTemp1 = getBiggestSegment(slope, intercept, inliers, &n_inliers);
			
			//there is no point in continue trying if the segment explains all data
			if(segTemp1.n_inliers == n_data){
				segments[n_segments] = segTemp1;
				break;
			}
				
			//apply regression to the segment until it gets less inliers
			segTemp2.n_inliers = 0;
			while(1){
				copyPoints(inliers2, inliers, n_inliers);
				n_inliers2 = n_inliers;
				
				segTemp2 = linearRegression(inliers2, &n_inliers2);
				
				if(segTemp2.n_inliers > segTemp1.n_inliers){
					segTemp1 = segTemp2;
					copyPoints(inliers, inliers2, n_inliers2);
					n_inliers = n_inliers2;
				}
				
				else
					break;
			}
			
			//compare with the biggest segments until now
			if(segTemp1.n_inliers > segments[n_segments].n_inliers)
				segments[n_segments] = segTemp1;
		}
		
		if(segments[n_segments].n_inliers >= 8){
			//remove inliers of the segment
			removeInliers(segments[n_segments]);
			n_segments++;
		}
		else
			break;
	}
}