5

在 OpenCV 中,对投影到 3D 表面的图像应用校正的最佳方法是什么,如我的示例中或Projection on 3D surface中所示?

我对 OpenCV 棋盘角检测的第一次测试看起来不太有希望。如果相机角度太陡,图像太扭曲或太小(太远),没有检测到角落。此外,如果棋盘有太多字段。

我的想法是使用类似于 3D 扫描仪中使用的算法来检测表面(物体),但我不知道这是否可以通过 OpenCV 实现。即使使用 OpenCV 不可能,用于此类对象扫描的算法是什么?

该图像显示了未经任何校正的外观。 表面上未校正的投影

绿色矩形是校正后的投影。 校正投影(绿色)

4

1 回答 1

2

正如我用于ProCamCalib的标记,应该比棋盘模式更可靠地检测到。您可以将ARToolkitPlus与 ProCamCalib 一起使用,但还有其他选择,或者您可以制作自己的小探测器。:) 然后,使用检测到的标记角坐标,我们可以使用 OpenCV 的其余校准功能以相同的方式进行校准。

我也可以用它做一些很酷的事情,如ProCamTracker页面所示。

编辑:现在我更好地理解了这个问题,我们可以很容易地为静态场景完成此操作,尽管 OpenCV 对我们帮助不大。首先,我们将相机放置在我们希望观众看到校正投影的位置。然后,我们投影二进制模式(看起来像本地闪烁的点),并捕获这些点模式的图像。(我们可以让它们变得更密集,直到它们变成条形,这种技术称为结构光。)在从相机图像中检测并将这些点解码为二进制代码后,我们得到相机<->投影仪像素对应关系,以及一些顶点无论如何,从那里它是 100% 的图形。这是一篇更详细地介绍了这些步骤的论文:

Zollmann, S.、Langlotz, T. 和 Bimber, O.
任意表面上与视图相关的投影的被动-主动几何校准
http://140.78.90.140/medien/ar/Pub/PAGC_final.pdf
演示视频:http:// /140.78.90.140/medien/ar/Pub/PAGC.avi

EDIT2:通过投影某种图案,我们可以计算出投影仪图像中对应于相机图像中给定像素的像素坐标。我们经常使用时间点模式,因为它很容易检测和解码……实际上,OpenCV 可能会派上用场。我想我会尝试这样做的方式是这样的。为简单起见,我们只取 2 位。因此,我们有四个图像:00、01、10 和 11。由于我们控制投影仪图像,我们知道这些,但我们也必须在相机图像中找到它们。首先,我将拍摄最后一张(相机)图像 11,并使用 cvAbsDiff() 从第一张(相机)图像 00 中减去它,然后使用 cvThreshold() 对结果进行二值化,并在二进制文件中找到轮廓(或斑点)带有 cvFindContours() 的图像。我们应该使用 cvContourArea() 确保每个轮廓都有一个合适的区域,而我们可以使用 cvMoments() 找到它的质心。然后我们可以开始处理其他图像。对于每个轮廓,我会尝试将 cvBoundingRect() 与其他(也使用 cvThreshold() 相机二值化)图像中的 cvCountNonZero() 像素,在这些边界矩形内,我们可以通过 cvSetImageROI() 设置。如果非零计数很大,则应将其注册为 1,否则应注册为 0。

一旦你有了所有的位,你就有了代码,你就完成了。

于 2012-01-18T13:42:14.867 回答