Ransac算法所用:C++生成不重复的随机数以及vector数组随机重排序

参考:https://blog.csdn.net/a19990412/article/details/78655331

首先要在生成随机数函数的前面设置一个种子,利用srand()函数,在头文件cstdlib中:

新建一个随机数生成类可以在类的构造函数中设置种子,增加代码的重用。

#pragma once
#ifndef __RANDOMNUMBER_H__
#define __RANDOMNUMBER_H__
#include <ctime>//time
#include <cstdlib> //rand srand
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
class RandomNumber {
public:
	RandomNumber() {
		srand(time(0));
	}

	int GetRandomNum(int begin = 0, int end = 1) {
		return rand() % (end - begin + 1) + begin;
	}
	vector<Point2f> GetRandomVector(vector<Point2f> contours)
	{
		random_shuffle(contours.begin(), contours.end());
		return contours;
	}
};

#endif

可以实现生成某范围的随机数和vector数组元素随机重排排序。

用法:

		//加入一些噪声点
		Point2f noisePoints;
		RandomNumber r, s;//提前设置种子
		for (int i = 0; i < 48; i++)
		{			
			noisePoints.x = corMidContours[i].x + r.GetRandomNum(-20, 20);
			noisePoints.y = corMidContours[i].y + s.GetRandomNum(-20, 20);
			corMidContours.push_back(noisePoints);
		}
RandomNumber r;//用类的方法设定种子
while (k < kMax)
{
    ...
    if (!RandomSelectPoints(r, corMidContours, nLeast, maybeinliers, testData))//随机获取其他样本点
		return;
    ...
}

RandomSelectPoints函数如下:

	bool CEllipse::RandomSelectPoints(RandomNumber r, vector<Point2f> contours,int nNums, vector<Point2f>& outContours, vector<Point2f>& outTestContours)
	{
		if (outContours.size() != 0)
			outContours.clear();
		if (outTestContours.size() != 0)
			outTestContours.clear();
		//random_shuffle(contours.begin(), contours.end());
		contours = r.GetRandomVector(contours);//调用vector随机不重复重排序函数

		if (nNums > contours.size())
			return false;
		for (int i = 0; i < nNums; i++)
		{
			outContours.push_back(contours[i]);
		}
		for (int i = nNums; i < contours.size(); i++)
		{
			outTestContours.push_back(contours[i]);
		}
	}

猜你喜欢

转载自blog.csdn.net/vict_wang/article/details/81070507