我有一个相机指着显示一行白色像素的显示器。我从相机中获取了一个字节值数组。摄像机视图的区域大于显示器占用的空间。我需要找出相机图像上白色显示器像素出现的位置。请参阅下面的示例图片。
我需要改进算法,以便在不同的光照条件下更加稳健。具体来说,我需要改进确定被认为是潜在白色像素的值阈值的步骤。在确定可能是我的白色像素之后,我找到了最大的邻域来确定我的最终白色值。
我还尝试计算具有最高值的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();
答案 0 :(得分:3)
首先,您可能希望以高于均值的一个标准偏差进行阈值处理,以摆脱屏幕的较暗部分。然后,您可以利用这样一个事实:与背景中的一些较亮区域相比,线条非常薄,并且由于屏幕的边缘,它也远离其他明亮区域。
伪代码:
mask=threshold(img, mean(img)+stdev(img))
toignore=dilate(mask,3,3)
toignore=erode(toignore,4,4)
toignore=dilate(toignoe,3,3)
mask=mask &! toignore
还有一些杂散像素,但你现在可以进行霍夫变换。
答案 1 :(得分:0)
您可以使用Hough变换在图像上查找线条:http://en.wikipedia.org/wiki/Hough_transform
这是openCV api:http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html