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