cv::Scalar FitAnalyzer::getRandomColor(){
    // 用当前时间做种子,确保每次运行颜色不同
    static mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    uniform_int_distribution<int> dist(50,255);
    return cv::Scalar(dist(rng), dist(rng), dist(rng));
}

1. uniform_int_distribution 是什么?

它是 C++ 标准库( 头文件)里的 “均匀整数分布器”,作用就像一个 “转换器”:

  • 输入:从随机数引擎(比如你代码里的 mt19937 rng)得到的 “无规则原始随机数”(范围很大,可能是 0 到几十亿,不直接能用);
  • 输出:把原始随机数 “压缩” 到你指定的 [最小值,最大值] 范围,并且保证这个范围内的每个整数被选中的概率是 “均匀的”(比如 [50,255] 里,50 和 255 出现的概率一样,不会偏向某一端)。

2. 为什么是 (50, 255)?

因为 OpenCV 里的颜色通道(B、G、R)取值范围是 0~255(0 是最暗,255 是最亮),这里设 [50,255] 是为了:

  • 避免生成 “太暗的颜色”:如果范围是 0~255,可能会生成 0~50 的暗色系(比如接近黑色的颜色),绘制在图像上(尤其是背景较暗时)会看不清(比如外接圆和背景融在一起);
  • 保证颜色 “足够亮”:50~255 的范围能确保生成的颜色亮度足够,无论图像背景是亮是暗,都能清晰看到绘制的图形(比如外接圆)。

3. cv::Scalar 是什么?

它是 OpenCV 定义的一个 **“数值容器”,最常用的场景就是表示颜色 **:

  • OpenCV 中图像的颜色默认是 BGR 格式(不是我们平时说的 RGB),所以 cv::Scalar(B, G, R) 里的三个参数分别对应:
  • 第一个参数:B 通道(蓝色)的亮度值(0~255);
  • 第二个参数:G 通道(绿色)的亮度值(0~255);
  • 第三个参数:R 通道(红色)的亮度值(0~255);
  • 例子:cv::Scalar(0, 0, 255) 表示 “纯红色”(B=0,G=0,R=255),cv::Scalar(255, 0, 0) 表示 “纯蓝色”。

4 .为什么要写三次 dist(rng)?

因为 B、G、R 三个通道需要独立的随机亮度值,才能生成 “真正的随机彩色”:
每次调用 dist(rng),都会从随机数引擎 rng 中获取一个 [50,255] 的随机整数;

  • 第一次调用:给 B 通道分配一个随机值(比如 120);
  • 第二次调用:给 G 通道分配另一个随机值(比如 200);
  • 第三次调用:给 R 通道分配第三个随机值(比如 80);

最终生成的 cv::Scalar(120, 200, 80) 就是一个 “蓝、绿、红混合的随机彩色”,能用来给不同的外接圆上色(每个圆颜色不同,方便区分)。

总结

rng 直接获取 50~255 的值,dist 负责把 rng 生成的 “原始随机数” 转换成 50~255 范围的数。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐