opencv产生随机的颜色

//将HSV颜色空间值转换成RGB值,参考这里
cv::Scalar HSV2RGB(const float h, const float s, const float v) { const int h_i = static_cast<int>(h * 6); const float f = h * 6 - h_i; const float p = v * (1 - s); const float q = v * (1 - f*s); const float t = v * (1 - (1 - f) * s); float r, g, b; switch (h_i) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; default: r = 1; g = 1; b = 1; break; } return cv::Scalar(r * 255, g * 255, b * 255); }
//固定s和v值,改变h值,并通过黄金分割得到随机均匀的h值,从而得到较理想的随机颜色 vector
<cv::Scalar> GetColors(const int n) { vector<cv::Scalar> colors; cv::RNG rng(12345); const float golden_ratio_conjugate = 0.618033988749895; const float s = 0.3; const float v = 0.99; for (int i = 0; i < n; ++i) { const float h = std::fmod(rng.uniform(0.f, 1.f) + golden_ratio_conjugate, 1.f);//始终返回(0,1)区间的小数,取余fmod(a,b)=a-n*b(n为最大整除得到的整数商)商的符号取决于a colors.push_back(HSV2RGB(h, s, v)); } return colors; }

RNG rng(12345)

随机数生成器RNG,计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值,所以只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。opencv 里RNG类构造函数初始化为固定值后,随机种子也是固定的,所以在同一个平台上,编译后每次运行它,显示的随机数是一样的,上面的代码运行后产生的随机颜色都是一样的,是不是顿时有种“随机也非随机”的感觉。也就是说如果我们在目标检测上可以为相同的类标记为同一个颜色,而且不管运行多少次,都会保留初始化的随机颜色序列。

posted on 2018-03-08 15:11  greathuman  阅读(4071)  评论(0编辑  收藏  举报