我有一个相机指向显示一行白色像素的显示器。我从相机返回一个字节值数组。摄像头的视野区域大于显示器占用的空间。我需要找出相机图像上白色监视器像素出现的位置。请参阅下面的示例图像。
我需要改进我的算法,使其在不同的光照条件下更加稳健。具体来说,我需要改进确定被视为潜在白色像素的值阈值的步骤。在确定什么可能是我的白色像素后,我找到最大的邻域来确定我的最终白色值。
我还尝试计算具有最高值的 N 个像素,并将 N 个像素的最低值视为白色。这在某些情况下工作得相当好,但当房间稍微变暗时它就停止工作了。我可以调整 N 以在任何光照条件下工作,但我宁愿不必手动提供任何参数。我现在正在尝试使用百分位数,但由于数据集非常大,因此运行速度很慢。
这是效果不错的方法之一,但必须在不同的光照条件下调整参数。
std::multiset<uint8_t> maxPixelValues;
for(unsigned i = 0; i < width; ++i)
{
for(unsigned j = 0; j <height; ++j)
{
uint8_t pixelValue = buffer[j * width + i];
if(maxPixelValues.size() < topPixelCount)
{
maxPixelValues.insert(pixelValue);
}
else
{
auto minimumValuePosition = maxPixelValues.begin();
if(pixelValue > *minimumValuePosition)
{
maxPixelValues.erase(minimumValuePosition);
maxPixelValues.insert(pixelValue);
}
}
}
}
return *maxPixelValues.begin();