参考: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]);
}
}