Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing OpenCV:如何使用图像计算相机和对象之间的距离?_Image Processing_Opencv - Fatal编程技术网

Image processing OpenCV:如何使用图像计算相机和对象之间的距离?

Image processing OpenCV:如何使用图像计算相机和对象之间的距离?,image-processing,opencv,Image Processing,Opencv,我是OpenCV的新手。我使用以下公式计算距离: distance to object (mm) = focal length (mm) * real height of the object (mm) * image height (pixels) ---------------------------------------------------------------- o

我是OpenCV的新手。我使用以下公式计算距离:

distance to object (mm) = focal length (mm) * real height of the object (mm) * image height (pixels)
                          ----------------------------------------------------------------
                                object height (pixels) * sensor height (mm)

OpenCV中是否有可以确定对象距离的函数?如果没有,是否有对示例代码的引用?

opencv中没有此类函数可用于计算对象与相机之间的距离。见此:

您应该知道,参数取决于相机,如果相机更改,参数也会更改

  • 要获得真实世界和相机之间的映射,而不需要相机的任何先验信息,您需要校准相机
  • 为了计算深度,即相机和物体之间的距离,你需要至少两张由两台不同相机拍摄的同一物体的图像,这通常被称为立体视觉技术
  • 如何计算已知尺寸物体的距离 你需要提前知道两件事中的一件

    • 焦距(单位为毫米和每毫米像素数)
    • 图像传感器的物理尺寸(计算每毫米像素数)
    我将使用焦距,因为我不想在谷歌上搜索传感器数据表

    校准照相机 使用OpenCV
    calibrate.py
    工具和源代码中提供的棋盘模式PNG生成校准矩阵。我从尽可能多的角度拍摄了大约20多张棋盘照片,并将这些文件导出到我的Mac电脑。有关更多详细信息,请查看

    摄像头校准矩阵(iPhone 5S后摄像头)
    • f_x=2803
    • f_y=2805
    • c_x=1637
    • c_y=1271
    查看您拍摄的一系列棋盘照片的详细信息,您会发现照片的本机分辨率(3264x2448),在iPhoto中可见的JPEG中,您可以找到焦距值(4.15mm)。这些项目应根据摄像机的不同而有所不同

    每毫米像素数 我们需要知道图像传感器上每毫米像素数(px/mm)。从上一页我们知道f_x和f_y是焦距乘以比例因子

    f_x = f * m_x
    f_y = f * m_y
    
    因为每个公式有两个变量,我们可以求解m_x和m_y。我的平均成绩是2803分和2805分,得到2804分

    m = 2804px / 4.15mm = 676px/mm 
    
    对象大小(以像素为单位) 我使用OpenCV(C++)从这些点中取出一个点,并确定对象的大小为41px。请注意,我已经检索了对象的角,并询问了边界矩形的大小

    cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));
    
    小皱纹 在640x480的摄像机上拍摄的视频中,该对象为41px

    以较低分辨率转换px/mm 给定41px/133px/mm,我们看到图像传感器上物体的大小是.308mm

    距离公式 这正好很好。我测量了910毫米,经过一些改进,我可能可以减少误差

    欢迎反馈

    相似三角形法
    Adrian在pyimagesearch.com上演示。我们事先讨论过这个话题,他采用了类似的三角形方法,我做了相机内部分析。

    相机参数我保持不变,我知道它们是否有必要有两个相机?你给出的公式是一个理想情况,当相机的主轴垂直于物体平面……如果相机的主轴倾斜到对象平面(这通常是真实世界场景…)然后我们得到物体在图像中的投影…投影的图像不能给你真实世界中物体尺寸的正确想法…因此,对于一台相机来说,如果你事先不知道相机相对于物体的方向,这是很困难的…如果你知道所有的细节,你还需要校准相机吗关于相机的细节已经有了吗?+1正在寻找相同的,你找到了任何解决方案吗?非常好的解释。但是如果你不能校准你的相机,你也可以这样做吗?那么,您会使用本机相机分辨率吗?当不校正失真时,这有多可靠?如何仅使用本机解析应用此方法?抱歉问了这么多问题;)如果没有摄像机校准,你就要关机了。我想您可以使用传感器规格来获取测量值,或者只是在各种设备中建立一个摄像头数据库。我们可以放心地假设所有iPhone 5s的背面摄像头都在一定的公差范围内。此外,找出如何转储高通Vuforia libraries的摄像头校准数据库将是一项有人可以调查的任务。好的,让我详细说明我的问题。我想在没有相机的情况下计算给定图像中特定对象的距离。这是一个佳能EOS 60D与失真校正。从JPEG图像中的EXIF标签,我可以检索焦距。我知道物体的尺寸单位是毫米。你认为你的方法适用于这个问题吗?不。公式是:距离=尺寸×焦距/传感器上的尺寸。整个方法取决于在给定焦距和被测物体尺寸的情况下,计算出物体在传感器上的大小。否则,你有两个未知数。@桑德,你可以考虑使用完全相同的三角形的完全不同的方法。有关详细信息,请参阅
    cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));
    
    3264/676 = 640/x
    x = 133 px/mm
    
    distance_mm = object_real_world_mm * focal-length_mm / object_image_sensor_mm
    distance_mm = 70mm * 4.15mm / .308mm
    distance_mm = 943mm