我一直在尝试使用OpenCV/Python检测水的边缘,但我得到的结果相当不准确,而且没有稳健性。这就是我迄今为止所取得的成就:原始图像,输出图像
Canny边缘检测
我目前正在做的是设置一些变量(高斯模糊的水平,用于Canny边缘检测的西格玛,以及测量的水平在每个点之间可以变化的最大偏差),执行"自动"Canny边缘探测(其中测量中值像素强度并用于形成上下边界),然后从左下角向上移动以找到第一个"白色"像素。这是在整个帧长度的五个x间隔内完成的。
这些点的平均y值即为计算值。然后测试每个点,看看它是否偏离平均像素太远,偏差限制会提前设置。然后将剩余的点绘制在图像上作为蓝线。绘制的像素的平均值记录在每一帧上。
在30帧之后,计算平均值的平均值并将其绘制为红线,然后将其假设为"真实"水位。
有人对更好的方法有什么想法吗?是什么让水边更显眼?这种方法适用于我录制的大多数镜头,但效果不佳。
提前谢谢。
我也处理过类似的问题,我希望这些建议能在某种程度上帮助你:
- 试着限制你的搜索区域:你能假设水位应该在哪里吗?还应考虑是否已正确检测到水位。假设在接下来的几帧中,水位将不断下降/上升,这是否安全?它会慢慢改变吗?裁剪您的图像,以便只考虑可以安全假设水位存在的区域
- 更改颜色空间:您可以尝试在HSV等其他颜色空间中工作,以便将亮度与色度分离
- 霍夫变换线条检测:尝试使用此算法搜索图像中的特定水平线条或其他形状
- 图像不失真:如有必要,尝试校正图像以校正曲线,或使用反向透视映射(IPM)取消透视
您还可以考虑更改边缘检测算法。