OpenCV:从已知大小的正方形中查找像素宽度

时间:2015-09-24 12:28:57

标签: android c++ opencv

在OpenCV中,我使用相机拍摄一个包含两个正方形 a b 的场景,两个距离相机的距离相同,其已知的实际尺寸为,分别为10厘米和30厘米。我发现每个正方形的像素宽度,其中包括25和40像素(得到像素宽度' OpenCV将正方形检测为cv::Rect个对象,我读了他们的width字段)。

现在我从场景中移除方形 a 并将相机的距离更改为方形 b 。该程序现在获得正方形 b 的宽度,这可以说是80.是否有一个等式,使用我可以用来工作的相机配置(分辨率,dpi?)如果它被放回到与正方形 b 相同距离的场景中,那么正方形 a 的对应像素宽度是多少?

3 个答案:

答案 0 :(得分:2)

您的问题所需的数学可以在"计算机视觉中的多视图几何"的第9章中找到,它恰好可以在线免费获得:https://www.robots.ox.ac.uk/~vgg/hzbook/hzbook2/HZepipolar.pdf

您的问题的简短答案是: 不,不是这种格式。鉴于您在3D世界中工作,您还有一个自由度。因此,您需要获得更多信息以消除这种自由度(例如,通过了解两个方块相对于彼此的深度和/或关系,相机的移动......)。这主要取决于您的具体情况。无论如何,阅读和理解本书第9章应该可以帮到你。

PS:对我来说,似乎你的问题适合更广泛的基线匹配类别"问题。除了极线几何和基本矩阵之外,阅读此内容可能会帮助你。

答案 1 :(得分:1)

为了理解相机在2D图像中投影3D世界所进行的变换,您需要知道其校准参数。这些基本上分为两组:

  1. 内部参数:这些是每个摄像机特定的固定参数。它们通常由称为k的矩阵表示。
  2. Extrensic parameters :这取决于3D世界中的相机位置。通常它们由两个矩阵表示:R和T,其中第一个表示旋转,第二个表示翻译
  3. 为了校准相机,您需要一些模式(基本上是一组已知的坐标的3D点)。在OpenCV库中有几个例子可以支持执行摄像机校准:

    http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html

    校准完相机后,您可以通过以下等式轻松地从3D转换为2D:

    Pimage = K·R·T·P3D

    因此,它不仅取决于相机的位置,还取决于所有校准参数。以下介绍通过相机校准细节以及在3D< - >期间使用的不同步骤和等式。图像转换。

    https://www.cs.umd.edu/class/fall2013/cmsc426/lectures/camera-calibration.pdf

    考虑到这一点,您可以将任何3D点投影到图像并获得其坐标。反向变换并不是唯一的,因为从2D返回到3D将为您提供一条线而不是一条独特的点。

答案 2 :(得分:1)

因为你写了" square"只有一个"宽度"在图像中(而不是"梯形"有一些不稳定的顶点坐标)我假设你正在考虑一个理想的针孔相机而忽略任何透视畸变/缩短 - 即没有镜头失真,你的平面物体是与图像/传感器平面完全平行。

然后,这是一个非常简单的2D投影几何问题,并且不需要单独的相机几何知识。在第一种情况下写下投影方程:你有4个未知数(相机焦距,方块的共同深度,左边的水平位置(比方说)和4个方程(每个左边的投影)解决系统并保持焦距和正方形之间的相对距离。在第二张图像中做同样的事情,但现在用已知的焦距,并计算正方形的新深度和水平位置< strong> b 。然后添加先前计算的相对距离,以找到方形 a 的位置。