Opencv 使用立体摄影机到对象的距离

Opencv 使用立体摄影机到对象的距离,opencv,camera,distance,stereo-3d,stereoscopy,Opencv,Camera,Distance,Stereo 3d,Stereoscopy,有没有办法用立体相机计算到特定物体的距离? 是否有一个方程或什么东西可以用视差或角度来计算距离?我仍在研究它,所以我不会发布完整的源代码。但我会给你一个概念上的解决方案 您需要以下数据作为输入(两个摄像头): 摄像机位置 摄影机关注点(摄影机正在查看的点) 摄像机分辨率(水平和垂直) 摄像机视场角度(水平和垂直) 你可以自己测量最后一个,把相机放在一张纸上,画两条线,测量线之间的角度 摄影机不必以任何方式对齐,您只需要能够在两个摄影机中看到您的对象 现在计算从每个摄影机到对象的向量。每个摄影

有没有办法用立体相机计算到特定物体的距离?
是否有一个方程或什么东西可以用视差或角度来计算距离?

我仍在研究它,所以我不会发布完整的源代码。但我会给你一个概念上的解决方案

您需要以下数据作为输入(两个摄像头):

  • 摄像机位置
  • 摄影机关注点(摄影机正在查看的点)
  • 摄像机分辨率(水平和垂直)
  • 摄像机视场角度(水平和垂直)
你可以自己测量最后一个,把相机放在一张纸上,画两条线,测量线之间的角度

摄影机不必以任何方式对齐,您只需要能够在两个摄影机中看到您的对象

现在计算从每个摄影机到对象的向量。每个摄影机都有对象的(X,Y)像素坐标,需要计算向量(X,Y,Z)。请注意,在简单的情况下,在摄像机的正中间看到对象,解决方案将简单地是(CAMA.PoPotoPalf-相机。位置)。< /P> 一旦两个向量都指向目标,由这些向量定义的线应该在理想世界中的一个点上相交。在现实世界中,由于测量误差小和相机分辨率有限,它们不会出现。因此,使用下面的链接来计算两条直线之间的距离向量

在这个链接中:P0是你们的第一个cam位置,Q0是你们的第二个cam位置,u和v是从摄像机位置开始指向你们目标的向量

你对实际距离不感兴趣,他们想计算。你需要向量WC——我们可以假设对象在WC的中间。一旦确定了对象在三维空间中的位置,就可以获得所需的任意距离


我将很快发布完整的源代码。

注意:这里描述的所有内容都可以在学习OpenCV手册中有关相机校准和立体视觉的章节中找到。您应该阅读这些章节,以便更好地理解以下步骤

一种不需要您自己测量所有相机内部和外部的方法是使用openCVs校准函数。摄像机内部(镜头畸变/歪斜等)可以使用cv::calibrateCamera计算,而外部(左右摄像机之间的关系)可以使用cv::stereoCalibrate计算。这些函数获取像素坐标中的许多点,并尝试将它们映射到真实世界的对象坐标。CV有一种很好的方法来获取这些点,打印出黑白棋盘,并使用CV::findChessboardCorners/CV::cornerSubPix函数来提取它们。大约10-15对棋盘图像就可以了

通过校准功能计算的矩阵可以保存到光盘中,这样您就不必在每次启动应用程序时重复此过程。这里有一些简洁的矩阵,可以创建一个校正映射(cv::StereoRective/cv::InitUnderortRectiveyMap),稍后可以使用cv::remap应用于图像。还可以得到一个称为Q的整洁矩阵,它是深度矩阵的视差

校正图像的原因是,一旦一对图像的处理完成(假设校准正确),一幅图像中的每个像素/对象都可以在另一幅图像的同一行中找到

根据您在图像中寻找的功能类型,有几种方法可供选择。一种方法是使用CVs立体对应函数,例如立体块匹配或半全局块匹配。这将为您提供整个图像的视差贴图,可以使用Q矩阵(cv::ReprojectMageto3D)将其转换为3D点

这种方法的缺点是,除非图像中有很多纹理信息,否则CV实际上并不擅长构建密集的视差贴图(在其中会出现无法找到给定像素的正确视差的间隙),因此另一种方法是找到您想要匹配的点。假设您在左图像中的x=40、y=110和右图像中的x=22中找到了特征/对象(因为图像经过校正,所以它们应该具有相同的y值)。视差计算为d=40-22=18


在我们的例子(40110,18)中,构造一个cv::Point3f(x,y,d)。以相同的方式找到其他感兴趣的点,然后将所有点发送到cv::perspectiveTransform(使用Q矩阵作为变换矩阵,本质上此函数是cv::ReprojectionMageto3D,但用于稀疏视差贴图)输出将是XYZ坐标系中的点,左摄像机位于中心。

我有检测人脸的源代码,不仅返回深度,还返回真实世界的坐标,左摄像机(或右摄像机,我不记得)是原点。它是根据“学习OpenCV”的源代码改编的,并参考一些网站使其工作。结果通常是相当准确的。

我希望你不介意,我把你的第二句话改写了一点。如果答案确实回答了你的问题,试着将答案标记为接受。嗨,托尼,你能给我一些关于这个源代码的详细信息吗?他说,买一本“学习OpenCV”的书,这真是值得投资的。你也可以在谷歌上找到这本书的源代码,但同样,没有这本书,你无法很好地解释书中的内容。你有没有提供过完整的源代码?我想看看(另一个)从两个角度获得深度的例子images@Eiver. 请给出一些你实施的例子链接好吗?提前谢谢。@Eiver。你能和我们分享你的代码吗?谢谢你advance@MohamedAM-哈桑你好!很抱歉,我被完全重定向到其他事情上,但始终无法完成此任务。过程总结得很好,没有多少人能够完成