如何测量光学测距仪中的图像重合度
How to measure image coincidence in an optical rangefinder
我有几个 USB 网络摄像头(固定焦距)设置作为一个简单的 stereoscopic rangefinder, spaced N mm apart with each rotated by M degrees towards the centerline, and I've calibrated the cameras 以确保对齐。
调整角度时,如何测量图像之间的重合度(最好在 Python/PIL/OpenCV 中)以了解相机何时聚焦在物体上?是不是简单到在每幅图像中选择一段像素(A行B列),然后计算像素之间的差值之和?
问题是你不能假设相机像素完美对齐
所以假设 x
轴是视差偏移轴并且 y
轴对齐。你需要识别x轴图像distortion/shift来检测视差对齐,即使你尽可能对齐。 abs 差异的结果不能保证在 min/max
中,因此不是减去单个像素而是减去该像素附近区域的平均颜色 radius/size 大于 y-axis
中的对齐误差。让我们将此半径或大小称为 r
,这样对齐后产生的差异应该很小。
近似搜索
您甚至可以通过 r
加快该过程
- select大
r
- 扫描整个 x 范围,例如
0.25*r
- 选择最低的差异 x 位置 (
x0
)
- 将
r
改为一半
- 转到项目符号 2(但这次整个 x 范围正好在
<x0-2.0*r,x0+2.0r>
之间
- 如果
r
小于几个像素则停止
这样您就可以在 O(log2(n))
而不是 O(n)
中搜索
计算机视觉方法
这应该会更快:
- 检测兴趣点(在展位图像中)
- 梯度等的具体变化...
- 图像之间交叉匹配兴趣点
- 计算交叉匹配点之间的平均 x 距离
- 根据找到的点距离更改视差对齐
- 转到项目符号 1 直到 x 距离足够小
这样你就可以避免检查整个 x 范围,因为对齐距离是直接获得的......你只需要将它转换为角度或任何你用来对齐视差的东西
[备注]
您不需要对整个图像区域执行此操作,只需 select 沿着图像的几条水平线并扫描其附近区域即可。
还有另一种检测对齐的方法,例如对于短距离,倾斜是对齐的重要标志,因此请比较相机左右两侧的物体高度...如果接近相同,则如果bigger/smaller 你没有对齐并且知道转向哪条路......
我有几个 USB 网络摄像头(固定焦距)设置作为一个简单的 stereoscopic rangefinder, spaced N mm apart with each rotated by M degrees towards the centerline, and I've calibrated the cameras 以确保对齐。
调整角度时,如何测量图像之间的重合度(最好在 Python/PIL/OpenCV 中)以了解相机何时聚焦在物体上?是不是简单到在每幅图像中选择一段像素(A行B列),然后计算像素之间的差值之和?
问题是你不能假设相机像素完美对齐
所以假设 x
轴是视差偏移轴并且 y
轴对齐。你需要识别x轴图像distortion/shift来检测视差对齐,即使你尽可能对齐。 abs 差异的结果不能保证在 min/max
中,因此不是减去单个像素而是减去该像素附近区域的平均颜色 radius/size 大于 y-axis
中的对齐误差。让我们将此半径或大小称为 r
,这样对齐后产生的差异应该很小。
近似搜索
您甚至可以通过 r
- select大
r
- 扫描整个 x 范围,例如
0.25*r
- 选择最低的差异 x 位置 (
x0
) - 将
r
改为一半 - 转到项目符号 2(但这次整个 x 范围正好在
<x0-2.0*r,x0+2.0r>
之间
- 如果
r
小于几个像素则停止
这样您就可以在 O(log2(n))
而不是 O(n)
计算机视觉方法
这应该会更快:
- 检测兴趣点(在展位图像中)
- 梯度等的具体变化...
- 图像之间交叉匹配兴趣点
- 计算交叉匹配点之间的平均 x 距离
- 根据找到的点距离更改视差对齐
- 转到项目符号 1 直到 x 距离足够小
这样你就可以避免检查整个 x 范围,因为对齐距离是直接获得的......你只需要将它转换为角度或任何你用来对齐视差的东西
[备注]
您不需要对整个图像区域执行此操作,只需 select 沿着图像的几条水平线并扫描其附近区域即可。
还有另一种检测对齐的方法,例如对于短距离,倾斜是对齐的重要标志,因此请比较相机左右两侧的物体高度...如果接近相同,则如果bigger/smaller 你没有对齐并且知道转向哪条路......