|
|
1
5
如果你正在编写自己的库,那么为这个问题创建一个健壮的解决方案将允许你开发几个独立的代码块,你也可以将这些代码串在一起来解决其他问题。我假设你想在任意旋转、不同照明条件下、存在图像噪声、有一点非线性枕形失真/桶形失真等情况下找到棋盘的角。 尽管有一些简单的基于内核的技术可以将整个像素作为边缘像素,但在处理填充多边形时,您会希望使用能够以亚像素精度找到边缘的算法,以便执行精确的线拟合。即使从暗正方形到白正方形的梯度跨越了几个像素,“真实”边缘也会在某个子像素点找到,很可能不是你手动点击猜到的点。 我试图在这篇旧的SO帖子中提供一个关于边缘发现的简单摘要: what is the relationship between image edges and gradient? 对于像你这样的问题,一个稳健的解决方案是以亚像素精度沿着从暗到亮的过渡找到边缘点,然后将线拟合到边缘点,并使用线角度。如果您正在处理真实的相机图像,并且图像中存在未校正的径向失真,那么测量精度可能会出现一些问题,但我们会忽略这些问题。 如果你想找到一条边的精确拟合,那么最好在垂直于该边的方向上扫描子像素边。这就需要我们从一开始就对边缘方向有一些合理的估计。我们可以首先找到边缘方向的粗略估计,然后进行精确的线拟合。 下面的算法可能看起来有太多的步骤,但我的目的是指出如何提供一个稳健的解决方案。
然后,您将循环浏览blob列表,并对每个blob执行以下操作:
该算法为每个黑色方格独立地找到角度。对于这个应用程序来说,这可能有些过头了,但如果你正在开发一个库,也许它会给你一些关于实现什么子算法以及如何构建它们的想法。例如,该算法将依赖于这些技术的实现:
话虽如此,如果你愿意接受精度的轻微损失,如果你知道图像没有径向失真等,如果你只需要找到由所有复选框边缘定义的平行线的角度,那么你可以尝试。。
还有一些其他技术不太准确,但更容易实现:
等等。当你开发你的库并创建独立函数的健壮实现时,你可能会发现健壮的解决方案依赖的步骤比你想象的要多,但也会更清楚每个增量步骤的失败模式是什么,以及如何解决这种故障模式。 |
|
|
2
0
我能问一下,你用什么C++库来编码这个吗? Jerry是对的,如果你真的对图像应用一个阈值,它将是2位的,黑色或白色。你可能已经应用了一种限制器。 你可以通过应用你可能一直在使用的限制器,然后将所有非白色像素变成黑色,来制作阈值函数(如果你自己对图像处理进行编码)。如果你有正确的设置,正方形应该是孤立的,你将能够计算角度。 完成后,你可以使用路径查找算法找到一些边,任何边都可以。如果你找到了一条或多或少直的路径,你可以像现在这样使用极值点来确定角度。由于棋盘旋转仅在90度内相关,因此角度应为90度的模或2弧度以上的π。 |
|
|
3
0
我不确定它是否(接近) 这个 正确的答案,但我的第一反应是两次阈值:一次是将除黑色以外的任何东西都视为白色,另一次是对除白色以外的任何事物都视为黑色。 找到每个角度,然后在两个角度之间进行插值。 |
|
|
4
0
你的问题几乎没有解决办法,但都有一个非常重要的问题,而你似乎忽视了这个问题。注意:当您试图在图像中进行几何计算时,您使用的点必须尽可能远离另一个点。你在一个正方形内得了2分。这些点彼此非常接近,因此点的像素位置的微小误差会导致角度的大误差。当图像中有多个正方形时,为什么只使用一个正方形? 以下是一些解决方案:
|
|
|
VeceluXa · 在Android中将黑白位图转换为单通道JPEG 2 年前 |
|
|
Mohamed Obeid · 在灰度图像上散射网格 2 年前 |
|
|
Pete · 三维体积与其主轴对齐 2 年前 |
|
|
Doofenmirtz Mirtz · 录制视频中特定对象的角度检测 3 年前 |