如何找到一个正方形图案角落的像素坐标?

3
这可能与编程无关,但程序员可能是回答它的最佳人选。
为了进行相机校准,我在一张纸上印有一个8×8的方形图案。我必须手动将这些坐标输入到文本文件中。然后软件会从那里获取并计算校准参数。是否有脚本或某些软件可以在这些图像上运行,并获取每个64个正方形的4个角的像素坐标? alt text
4个回答

5
您可以使用传统的棋盘格模式(即没有间隙的黑白方块)和cvFindChessboardCorners()函数来实现此操作。您可以在OpenCV API参考中了解有关该功能的更多信息,并在O'Reilly的OpenCV图书其他在线网站看到一些示例代码。作为额外的奖励,OpenCV还内置了计算相机固有参数和平面标定对象多个视图的外部参数数组的函数。

感谢提供OpenCV参考,我不确定OpenCV是否能够解码这个模式(我可能错了),我在他们的校准页面上看到了一些其他的模式。 - Kevin Boyd
我所知道的所有标准校准程序(包括OpenCV和其他程序)都假定使用黑白“棋盘”图案,方格之间没有间隙。如果您不受限于使用您发布的校准图案,我强烈建议您使用这样的图案。如果这不是一个选项,那么您将不得不自己编写角点检测代码(如用户531627所描述的)。 - Michael Koval

2
我会做以下事情:
  • 应用阈值并获得二值化图像。
  • 对图像应用SobelX滤波器。您将获得一张具有垂直线条的图像。这些线条属于几乎垂直的正方形的边缘。将其保存为image1
  • 对图像应用SobelY滤波器。您将获得一张具有水平线条的图像。这些线条属于几乎水平的正方形的边缘。将其保存为image2
  • 进行(image1 xor image2)操作。您将获得一张黑色图像,其中白色像素表示角落位置。
希望这能帮到您。

那我该如何做到这一点呢?我的意思是说,我可以在哪个框架中实现这个功能? - Kevin Boyd
我会像Michael Koval建议的那样使用OpenCV(http://sourceforge.net/projects/opencvlibrary/)。 - Noti
无论如何,您都可以自己进行快速测试。只需构建一个图像。假设该图像是一个网格。[0,0] [1,0]...取第一行并使Image1[0,0]=SrcImage[1,0]-SrcImage[0,0],直到图像的末尾。因此,您将获得一个输出图像,其像素值等于相应像素和相邻像素之间的差异。这样 - Noti
我们得到类似于水平导数的东西。它揭示了在水平方向上对比度突然改变(正方形边缘)的区域。这是一个对SobelX的简单/快速逼近。 - Noti
有没有办法可以在Paint.Net或其他图像处理软件中检查它。 - Kevin Boyd

1

我相信有许多计算机视觉库具有不同的功能和许可证,但我能想起来的一个是ARToolKit,它应该能够识别这个模式。如果不可能,它还附带了一组非常好的模式,这些模式经过专门设计,即使部分遮挡也能被识别。


谢谢!我会去看看ARToolKit的!! - Kevin Boyd

0

我不熟悉ARToolKit(虽然我听说过很多),但使用OpenCV处理这个问题非常容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接