opencv中产生随机数的类CvRNG,以及C++底层随机数方法

近期做图像检测时用到的获取随机数的方法,以及遇到的一些问题。

操作背景:在一张大的背景图上获取n个随机矩阵,提取这些矩阵区域小图像的特征值,依次进行分类器处理分类。

首先使用opencv封装类CvRNG

//获取随机矩形,opencv中封装的随机类CvRNG
/////////////////////////////////////////////////////////////////
//出现问题:debug和release版本下的结果不一样,release下木有随机产生
void getRects_random_RNG(Mat in_img, vector<CvRect>& rects_vec)
{
	CvRNG rng;   //随机数产生类
	CvSize size = in_img.size();
	int X = in_img.rows;
	int Y = in_img.cols;

	for (int i = 0; i < 1000; i++)
	{
		//int num;
		//cvRandInt(&rng)%num;   //如果%num,出来的将会是0-(num-1)的正整数

		int d_s = (cvRandInt(&rng) % 60) + 40; //rng.uniform((double)40, (double)100);  // [40 ,100)的随机数
		int d_x = cvRandInt(&rng) % (X - d_s);
		int d_y = cvRandInt(&rng) % (Y - d_s);

		CvRect rect = cvRect(d_x, d_y, d_s, d_s);
		rects_vec.push_back(rect);
	}
}
在debug版本下


而在release版本下就出现了如下的问题,随机产生的1000个矩形区域只有左上角一个,也就是说1000个重叠了,至今不知道原因


在release版本下调试出现了不想得到的结果,所以只能换方法。采用c++的获取随机数的方法srand和rand(),代码如下:

void getRects_random(Mat in_img, vector<CvRect>& rects_vec)
{

	srand((int)time(0));     ///////////
	int X = in_img.cols;
	int Y = in_img.rows;

	for (int i = 0; i < 1000; i++)
	{

		int d_s = (rand() % 60) + 41; //  (40 ,100]的随机数
		int d_x = rand() % (X - d_s);
		int d_y = rand() % (Y - d_s);

		CvRect rect = cvRect(d_x, d_y, d_s, d_s);
		rects_vec.push_back(rect);
	}
}
结果与第一张图一样,且在debug和release下一样,至此完成。

猜你喜欢

转载自blog.csdn.net/zxj820/article/details/50594670