在行人识别的最后步骤,需要对识别出的行人进行标记。通常在实验阶段往往只是把ROI的框涂出来,但是在工程阶段,需要更加精细的标记方法以获得更好的用户体验。

经过总结,标记的ROI需要满足以下需求:

  • 只标记人的身体部分,不填或少填无关的部分;
  • 标记部分显示黄色,颜色深浅随着roi的置信度变化;

设计思路:

  • 一般人体的亮度均大于背景,因此可以设置一个阈值,只标记高于阈值的像素,实现只标记人体部分。
  • 我们红外图像只有亮度信息,对应到RGB色域中,RGB的值就是亮度的值。因此我们可以调高R和G的值来提高黄色的色度,降低B的值来增加颜色的深度。只要R和G的值一样且大于B就能获得理想的效果。

那么开始设计:

  1. 去除背景部分
  • 经过测试,行人身体的亮度大都大于192,因此只标记亮度大于192的像素。
  1. 通过两个像素的均值确定需要填图的黄色色度
  • yy = (ptr[current + 1] + ptr[current + 3]) >> 1;
  1. 根据当前亮度,调整黄色的明暗程度,这部分yb的值必须小于yy
  • yb = yy - (1 << level);
  1. 计算具体的亮度值
  • 因为R和G固定,因此直接优化为0.886 * yy,再带入上一公式,化简
  • y = yy - 0.114 * (1 << level);
  1. 换算YCbCr
  • ptr[current + 1] = y;
  • ptr[current + 3] = y;
  • ptr[current] = (yb - y) * 0.564 + 128;
  • ptr[current + 2] = (yy - y) * 0.713 + 128;
  1. 化简
y = ((ptr[current + 1] + ptr[current + 3]) >> 1) - 0.114 * (1 << level);

ptr[current + 1] = y;
ptr[current + 3] = y;
ptr[current] = (0 - 0.886 * (1 << level)) * 0.564 + 128;
ptr[current + 2] = (0.114 * (1 << level)) * 0.713 + 128;

效果展示