OpenCV对投影到3D表面的图像应用校正的最佳方法是什么,如我的示例或Projection on 3D surface中所示?
我使用OpenCV棋盘角检测的第一次测试看起来并不是很有希望。如果摄像机角度太陡,图像太扭曲或太小(太远)没有检测到角落。如果棋盘有太多字段,也是如此。
我的想法是使用像3D扫描仪一样的算法来检测表面(对象),但我不知道OpenCV是否可行。即使OpenCV不可能,用于此类对象扫描的算法是什么?
此图像显示了它没有任何修正的样子。
绿色矩形是经过校正的投影。
答案 0 :(得分:2)
我用于ProCamCalib的标记应该比棋盘图案更强大。您可以像使用ProCamCalib一样使用ARToolkitPlus,但还有其他选择,或者您可以制作自己的小探测器。 :)然后,利用检测到的标记角点坐标,我们可以使用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()对结果进行二值化,并在二进制文件中找到轮廓(或blob)使用cvFindContours()的图像。我们应该确保每个轮廓都有一个cvContourArea()的适当区域,而我们可以用cvMoments()找到它的质心。然后我们就可以开始用其他图像做事了。对于每个轮廓,我会尝试将cvBoundingRect()带到另一个cvCountNonZero()像素(也用cvThreshold()相机二进制化),在这些边界矩形中,我们可以通过cvSetImageROI()设置。如果非零计数很大,则应将其注册为1,否则为0。
一旦你拥有了所有的位,你就拥有了代码,而且你已经完成了。