zoukankan      html  css  js  c++  java
  • 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类构造函数初始化为固定值后,随机种子也是固定的,所以在同一个平台上,编译后每次运行它,显示的随机数是一样的,上面的代码运行后产生的随机颜色都是一样的,是不是顿时有种“随机也非随机”的感觉。也就是说如果我们在目标检测上可以为相同的类标记为同一个颜色,而且不管运行多少次,都会保留初始化的随机颜色序列。

  • 相关阅读:
    MyBatis源码分析-IDEA新建MyBatis源码工程
    MyBatis源码分析-SQL语句执行的完整流程
    揭开C++类中虚表的“神秘面纱”
    MyBatis源码分析-MyBatis初始化流程
    由一个多线程共享Integer类变量问题引起的。。。
    Java Web之Servlet技术
    Java内存模型与垃圾回收
    Java Web之会话技术
    Spring学习之第一个AOP程序
    Java Web之JSP技术
  • 原文地址:https://www.cnblogs.com/cvtoEyes/p/8528394.html
Copyright © 2011-2022 走看看