3

我想要做的是获取一个源图像,其中将包含一个已知物理尺寸和已知正方形数量的黑白方格板,并识别所述板的边界,以及它的角度被观察(假设它完全平坦)以及从什么距离观察。

如果我能可靠地识别棋盘的 4 个角,那么我就知道如何计算角度和距离,所以任务更多是关于识别棋盘。

到目前为止,我尝试的是对图像进行灰度化并增加对比度,因此我最终得到了一张鲜明的黑白图像(在眼睛看来,只有白色方块包含黑色) - 虽然我可以识别边界通过测量从黑色->白色->黑色的变化频率,从自上而下的角度来看,电路板很好,我不知道如何从任何角度进行此操作。

名义上我是用 C# 来做这件事的,但就实际答案而言,我很高兴看到任何具有类似 c 语法的代码示例——不过,我对这个的数学和方法更感兴趣。

4

1 回答 1

3

在 3d 世界中寻找一般的 2d 对象通常使用 SIFT 或 SURF。

有2个步骤:

  • 在图像中找到可管理数量的局部特征(例如强角)
  • 找到图像中的这些点与搜索模式之间的相关性

OpenCV 有一个实现: Features2D + Homography to find a known object The Wikipedia article on surf 还指出了另一个c# 实现。另请参阅此 Stackoverflow 答案


现在这是一种非常通用的方法,我不知道它与您的棋盘格配合得如何。

但是棋盘模式有特定的方法:例如openCV函数cvFindChessboardCorners教程

我从未使用过它,但我发现了这个算法的描述:(来源在文件 cvcalibinit.cpp 中

  • 通过阈值化来分割黑白方块的图像二值化
  • 找到黑色方块的角:
    • 找到黑色区域边界的轮廓
    • 选择合适形状的轮廓
    • 用 4 顶点多边形逼近这些轮廓
  • 在这些中选择类似于校准图案正方形的四边形
  • 提取选定四边形的角,附近至少有一个角
  • 根据校准对象的大小将选定四边形的角按线分组
于 2012-09-20T18:56:00.773 回答