在OpenCV中计算相机的位置和方向

9
假设有一个摄像头对准你的电脑屏幕。我试图确定摄像头旋转了多少,离屏幕有多远以及相对于屏幕中心在哪里。简而言之,翻转和平移矩阵。
我使用opencv来完成这个任务,按照他们的相机校准实例来使用棋盘格模式和网络摄像头的帧来完成此任务。我希望能够使用任何通用图像来完成,即屏幕截图和网络摄像头的帧。
我尝试使用特征检测算法从两个图像中获取关键点列表,然后使用BFMatcher将那些关键点进行匹配,但是遇到了问题。具体来说,SIFT不能正确匹配关键点,SURF不能正确地在缩放后的图像上找到关键点。
这个问题是否有更简单的解决方案?我觉得这可能是人们经常做的事情,但在网上没有找到太多讨论。
谢谢!!

3
为什么不试着在图像中找到屏幕,并找到它的轮廓呢?然后,你可以通过知道屏幕的实际尺寸、在图像中出现的尺寸以及在图像中的扭曲形状来确定旋转和平移。相比于现实生活中的矩形形状,你也知道屏幕在图像中的扭曲形状。嗯……这是个有趣的问题。+1 - eboix
2
这是一个很好的问题,因为这不是典型的平面标记任务。+1 - Jav_Rock
@eboix,你能否分享一下使用已知世界几何和倾斜图像几何来确定方向和位置的技术吗?我正在尝试做同样的事情,但是我使用的是天花板灯,它们的大小是已知的。 - Lucas
1个回答

5

在计算机视觉中,找到自然平面标记是一项常见任务,但在您的情况下,您有一个屏幕,这个屏幕根据您在屏幕上可视化的内容而变化,可以是您的桌面、浏览器、电影等。

因此,您无法应用常规的标记检测方法,您应该尝试形状识别。一个想法是在具有相同尺寸的矩形模板上(通过不同的比例)尝试粒子滤波器来进行边缘检测。

粒子滤波器将使模板适合帧区域。之后,您将知道位置。对于方向,您需要计算单应性,而且您需要“标记” 中的4个点,因此可以应用直接线性变换(cv::findHomography()会为您执行此操作)。因此,您的四个点可以是四个角落。这只是一个想法,祝你好运!


这里有一些幻灯片,解释了粒子滤波器的类似应用。它匹配一个更通用的模板,并且运行良好,因此对于您的应用程序来说,由于大小始终相同,它将表现得更好:http://www.slideshare.net/Javier_Barbadillo/single-person-pose-recognition-and-tracking-7742854 - Jav_Rock
不过,它的比例不一定相同。例如,当相机从侧面向下看屏幕时,宽度会比相机正对屏幕时更长。 - user1463993

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