问题标签 [camera-calibration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
16533 浏览

opencv - 使用 OpenCV 从屏幕坐标计算世界坐标

我已经用 OpenCV 计算了相机的内在和外在参数。现在,我想根据屏幕坐标 (u,v) 计算世界坐标 (x,y,z)。

我该怎么做?

注意,当我使用 kinect 时,我已经知道 z 坐标。

任何帮助深表感谢。谢谢!

0 投票
2 回答
3291 浏览

c++ - 从 2d 图像像素获取 3d 坐标系中的 x,y

使用具有固定位置的相机,我必须跟踪运动中的物体并将其定位在某个预先选择的坐标系中。想法是在已知高度的对象顶部放置一个特定的颜色标记,这样Z坐标就知道了。完成颜色跟踪后,我需要从找到颜色的 u 和 v 图像坐标中找出 X 和 Y。我已经完成了相机校准,我打算使用 cv::solvePnP 来获取旋转和平移向量。另外,我在这里学习了颜色跟踪,并从中编写了一个 C++ api。

我已经在这里找到了一个类似的问题,并从中学到了很多,但不同的是我只需要评估 X 和 Y,因为 Z 坐标是已知的(之前测量过)。如何获得具有预先指定 Z 的 X 和 Y 坐标?感谢帮助!

0 投票
3 回答
8063 浏览

opencv - 测试基本矩阵

我的问题是:

  • 如何确定我的基本矩阵是否正确?
  • 我在下面发布的代码是否对此做出了很好的努力?

我的最终目标是进行某种 3D 重建。现在我正在尝试计算基本矩阵,以便我可以估计两个相机之间的差异。我在 openFrameworks 中使用 ofxCv 插件执行此操作,但在大多数情况下,它只是纯粹的 OpenCV。由于 ofxCv 也在开发中,因此很难发布隔离问题的代码。

我的代码基本上读取了我的网络摄像头从稍微不同的位置拍摄的两个 640x480 帧(基本上只是水平滑动笔记本电脑一点点)。我已经有一个校准矩阵,它是从 ofxCv 的校准代码中获得的,它使用findChessboardCorners. 不失真示例代码似乎表明校准矩阵是准确的。它计算图片(calcOpticalFlowPyrLKcalcOpticalFlowFarneback)之间的光流,并将这些点对馈送到findFundamentalMatrix

为了测试基本矩阵是否有效,我将其分解为旋转和平移矩阵。然后我将旋转矩阵乘以第二张图像的点,看看相机之间的旋转差异是多少。我认为任何差异都应该很小,但我得到了很大的差异。

这是我最后一个代码的基本和旋转矩阵,如果有帮助的话:

这是我的部分代码,发生在拍摄第二张照片之后:

有任何想法吗?我的基本矩阵看起来是正确的,还是我在测试它时有错误的想法?

0 投票
2 回答
16977 浏览

matlab - 如何使用已知的相机参数在 Matlab 中使图像不失真?

这在OpenCV中很容易做到,但是我想要一个相当高效且可以轻松更改的原生 Matlab 实现。该方法应该能够采用上述链接中指定的相机参数。

0 投票
2 回答
1240 浏览

c++ - opencv 错误:当我校准相机时,convert.cpp (opencv) 中的断言失败

我尝试校准相机(opencv 2.3.1、VS 2010 和 Windows 7),但是当我编译我的程序时,出现一个 opencv 错误

“断言失败:<src.size==dst.size && src.channels<>dst.channels<>> 在未知函数中,文件 ....modules \core\src\convert.cpp,第 1277 行”。

这里是代码的一部分,

我试图解决这个问题很多次,请我需要帮助。

0 投票
3 回答
3881 浏览

computer-vision - 如何计算一台摄像机相对于第二台摄像机的外参?

我已经针对某个世界坐标系校准了 2 个相机。我知道它们每个相对于世界框架的旋转矩阵和平移向量。从这些矩阵如何计算一个相机相对于另一个相机的旋转矩阵和平移向量?

请提供任何帮助或建议。谢谢!

0 投票
0 回答
1888 浏览

opencv - 三角测量,来自 calibrateCameras()s 的 tvec 和 rvec

也很难找到我问题的确切答案,这就是为什么我想在这里问它,即使在其他地方解释得不好。我尝试在代码中添加解决方案,以便每个人都可以返回我的结果。但首先必须解决它。

它与 OpenCV 进行三角测量cv::triangulatePoints()。我知道它的记录很差,但可以在 willowgarage(现在)找到它(搜索文档 2.4.9)

  1. 我用于棋盘校准 22 个不同角度的立体图像(两个凸轮)等。为稳定的内在参数。
  2. 得到了棋盘角cv::findChessboardCorners()
  3. 可选的 -cv::cornerSubPix()
  4. 在所有棋盘点上创建 objectPoints cv::Point3f( k*m_squareSize, j*m_squareSize,0.0f)(k - 棋盘宽度,j 棋盘高度,反之亦然,squareSize = 真实世界大小)
  5. 做2.-4。对于每张图片
  6. 把所有东西都放在这里:cv::calibrateCamera(object_points1, image_points1, image.size(), intrinsic1, distCoeffs1, rvecs1, tvecs1);这个功能就像我想要的那样完美,我也在用第二个相机图像来做。经过长时间的研究,我发现了这一点:
  7. cv::Mat R12 = R2*R1.t(); cv::Mat T12 = T2-R*T1;这是针对 cam1 和 cam2 之间的关系 (R|T)。这工作得很好,我已经用cv::stereoCalibrate().
  8. 在这一步,我想使用我的 tvecs 和 rvecs 重新投影 2D 太 3D 和 3D 太 2D。最后我完成了cv::projectPoints(object_points1[i],rvecs1[i],tvecs1[i],intrinsic1, distCoeffs1, imagePoints1);-> 工作正常 - 我从 2Pixel 差异中得到了 48 * 2 * 22 点,最多只有一个点。但是知道我不能从 2d 到 3D 的三角测量走得更远。我有!太用了cv::triangulatePoints()。我怎么得到这个工作???

到目前为止我所做的尝试没有一个好的结果:您首先需要投影矩阵 P1 和 P2。

抱歉,这看起来很重,但它只有旋转矩阵 (rodrigues(rvecs1,R1)) 和平移向量 tvecs1。这是错的吗?我必须反转旋转矩阵 R1 吗?

下一步:您需要左右图像中的 imagePoints(Corners)。这些 imagePoints 是我从 findChessboardCorners() 获得的未失真角。

使用cv::triangulatePoints(P1, P2, cv::Mat(undisPt_set1).reshape(1,2), cv::Mat(undisPt_set2).reshape(1,2), point3d);point3d 后是一个“4D”点,其中第四个参数也被convertPointsHomogeneous(point3d.reshape(4, 1), point3dCam1);

这是我到目前为止所做的 - 但它不起作用。有人知道我做错了什么吗?最后一步有什么错误的想法吗?我已经尝试过数学,但我不确定投影矩阵 P1 和 P2。我知道它的构建类似于 [R|t],但它是我的 tvecs 和 tvecs 吗?它是转置的还是倒置的?任何帮助都会很好,但请帮助我提供一些代码或明确的步骤 - 而不是更多我应该阅读和思考的链接,我真的做了研究,我有学习 OpenCV 书、OpenCV2 食谱,还有 Hartley 和 Zisserman 在这里在我前面。但我无法做到。

0 投票
2 回答
33102 浏览

opencv - 从图像点计算 x,y 坐标 (3D)

我的任务是在 3D 坐标系中定位对象。由于我必须获得几乎精确的 X 和 Y 坐标,我决定跟踪一个已知 Z 坐标的颜色标记,该颜色标记将放置在移动对象的顶部,例如这张图片中的橙色球: 无失真

首先,我已经完成了相机校准以获取内在参数,然后我使用 cv::solvePnP 来获取旋转和平移向量,如下面的代码所示:

在拥有所有矩阵之后,这个方程可以帮助我将图像点转换为世界坐标:

变换方程

其中 M 是 cameraMatrix,R - rotationMatrix,t - tvec,s 是未知数。Zconst 表示橙色球所在的高度,在本例中为 285 mm。所以,首先我需要解上一个方程,得到“s”,然后我可以通过选择图像点找出X和Y坐标: 方程2

解决这个问题我可以找到变量“s”,使用矩阵中的最后一行,因为 Zconst 是已知的,所以这里是下面的代码:

在此之后,我得到了结果:P = [-2629.5, 1272.6, 285.]

当我将其与测量进行比较时,即:Preal = [-2629.6, 1269.5, 285。]

误差非常小,非常好,但是当我将这个盒子移动到这个房间的边缘时,误差可能是 20-40 毫米,我想改进它。任何人都可以帮助我,你有什么建议吗?

0 投票
1 回答
620 浏览

opengl - 使用 2 个摄像头进行头部姿势估计

我正在使用 2 个摄像头进行头部姿势估计项目。对于一个相机系统工作并返回头部相对于每个相机坐标系的旋转矩阵和平移向量。我在 OpenGL 场景中渲染了对象,该对象被旋转和平移以表示头部运动。要显示计算的旋转矩阵和平移向量,我只需使用以下 OpenGL 命令。

其中姿势矩阵是由头部的旋转矩阵和平移向量构造的 OpenGL ModelView 矩阵。

现在我正在尝试为 2 个校准的相机执行此操作。当第一个相机丢失了脸部的轨迹但第二个相机估计了头部姿势时,我会显示相对于第二个相机的旋转和平移,反之亦然。我想显示一个 OpenGL 对象并为这两种情况移动它。为此,我需要将姿势矩阵转移到公共坐标系中。

我知道 2 个相机相对于彼此的相对几何形状。我假设其中一个相机是世界坐标系,我通过将第二个相机的位姿矩阵和第二个相机的校准矩阵相对于第一个相机相乘,将第二个相机的头部姿势矩阵转移到第一个相机的框架。当我将此相乘矩阵加载到 OpenGL ModelView 矩阵中时,我得到了错误的结果。当第一台相机捕捉到人脸时,对象正在向右移动,但对于第二台相机,对象被平移和旋转,并且与第一台相机的情况不同。

可能是什么问题呢?也许OpenGL显示部分是错误的或者?

0 投票
1 回答
1825 浏览

opencv - 在Opencv中校准后查找点世界坐标

OpenCV 是否有这样的功能:

  • 图像平面中标记的坐标
  • 外在参数
  • 内在参数
  • z坐标(标记和凸轮之间的距离,因为我使用传感器kinect)

提供marker对应的世界坐标?

任何帮助深表感谢。谢谢!