使用OpenCV进行投影表面图像校正

6
在OpenCV中,如何在像我的示例或3D表面投影中投影到3D表面上应用校正是最好的方法?
我使用OpenCV棋盘格角点检测进行了第一次测试,但效果不太好。如果相机角度太陡,图像过于扭曲或者距离太远,则无法检测到任何角点。如果棋盘格方格过多也是如此。
我的想法是使用类似于3D扫描仪检测表面(物体)的算法,但我不知道是否可以在OpenCV中实现。即使OpenCV不能实现,用于此类对象扫描的算法是什么?
以下图片显示了未经任何校正的情况。 Uncorrected projection on surface 绿色矩形是已校正的投影。 Corrected projection (green)

你想要了解哪些具体细节? - Samuel Audet
首先感谢您的回答。您能否解释一些检测失真(算法)的基本原理?然后,如果某种方式发现了校正数据,使用哪些OpenCV方法进行校正最好?不幸的是,OpenCV文档非常贫乏。 - bkausbk
好的,首先我想澄清一些事情。你展示的绿色矩形是如何被“校正”的?它们似乎与截图中我所能看到的任何东西都不太匹配... 顺便说一句,在这个网站http://www.vision.caltech.edu/bouguetj/calib_doc/和这本书《计算机视觉中的多视角几何》http://www.robots.ox.ac.uk/~vgg/hzbook/上有很多关于这方面的细节,这些都是很好的参考资料。无论如何,请告诉我你是如何将这些绿色矩形标记为“已校正”的,谢谢。 - Samuel Audet
正确的意思是从特定位置看投影图像呈矩形,就像在这张图片http://vvvv.org/sites/default/files/imagecache/large/images/projecteddesktop.jpg中,图像被投射在白色盒子上并进行了校正,使其呈现矩形。 - bkausbk
啊,我明白了!我希望很快能给你一个更有用的答案。 - Samuel Audet
1个回答

2
标记物,如我在ProCamCalib中使用的,应比棋盘格模式更加稳健地被检测到。您可以像在ProCamCalib中一样使用ARToolkitPlus,但有其他选择,或者您可以制作自己的小型检测器。 :) 然后,通过检测到的标记点坐标,我们可以使用OpenCV的其余校准函数以相同的方式进行校准。
并且我也可以做很酷的事情,就像ProCamTracker页面上展示的那样。
编辑:现在我更好地理解了问题,对于静态场景,我们可以很容易地完成这项任务,尽管OpenCV对我们的帮助不大。首先,我们将相机放置在我们想要观察修正投影的位置。然后,我们投射二进制模式(看起来像局部闪烁的点),并捕获那些点模式的图像。(我们可以使它们更密集,直到它们变成条形,这是一种称为结构光的技术。)在从相机图像中检测和解码那些点成为二进制代码之后,我们得到了相机<->投影仪像素对应关系,至少有一定数量的顶点,从那里开始就是100%的图形学。这里有一篇论文详细介绍了这些步骤:
Zollmann、Langlotz和Bimber的Passive-Active Geometric Calibration for View-Dependent Projections onto Arbitrary Surfaces(基于视角的投影到任意表面的被动主动几何校准)
http://140.78.90.140/medien/ar/Pub/PAGC_final.pdf
演示视频:http://140.78.90.140/medien/ar/Pub/PAGC.avi 编辑2:通过投射某种模式,我们可以确定投影仪图像中对应于相机图像给定像素的像素坐标。我们经常使用时间点模式,因为它易于检测和解码...实际上,OpenCV可能会派上用场。我认为我会尝试这样做。为简单起见,我们只取2位。因此,我们有4幅图像:00、01、10和11。由于我们控制投影仪图像,所以我们知道这些,但我们也必须在相机图像中找到它们。首先,我会将最后一个(相机)图像11减去第一个(相机)图像00,使用cvAbsDiff(),然后将结果进行二值化处理,使用cvThreshold(),并在二进制图像中找到轮廓(或blob),使用cvFindContours()。我们应该确保每个轮廓都有适当的面积,使用cvContourArea(),而我们可以使用cvMoments()找到它的质心。然后,我们就可以开始处理其他图像了。对于每个轮廓,我会尝试在其他(同样使用cvThreshold()二值化相机)图像中取cvBoundingRect()到cvCountNonZero()像素,在这些边界矩形内。如果非零计数很大,则应将其记录为1,否则为0。
一旦你拥有所有的元件,你拥有了代码,你就完成了。

谢谢,这正是我在寻找的。我不明白为什么要使用点图案以及如何从中构建位移图,但是在学习文档后应该会清楚了。 - bkausbk
听起来像是你需要的,太好了!为了完整起见,我会添加更多细节... - Samuel Audet

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