近期做图像检测时用到的获取随机数的方法,以及遇到的一些问题。
操作背景:在一张大的背景图上获取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下一样,至此完成。