相关疑难解决方法(0)

来自cv :: solvePnP的世界坐标中的摄像机位置

我有一个校准过的相机(内在矩阵和失真系数),我想知道相机位置知道一些3d点及其在图像中的对应点(2d点).

我知道,cv::solvePnP能帮助我,看完这个这个我明白solvePnP的,我的产出rvectvec是对象在相机的旋转和平移坐标系.

所以我需要找出世界坐标系中的摄像机旋转/平移.

从上面的链接看来,代码在python中是直截了当的:

found,rvec,tvec = cv2.solvePnP(object_3d_points, object_2d_points, camera_matrix, dist_coefs)
rotM = cv2.Rodrigues(rvec)[0]
cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)
Run Code Online (Sandbox Code Playgroud)

我不知道python/numpy东西(我正在使用C++),但这对我来说没有多大意义:

  • rvec,来自solvePnP的tvec输出是3x1矩阵,3个元素向量
  • cv2.Rodrigues(rvec)是一个3x3矩阵
  • cv2.Rodrigues(rvec)[0]是3x1矩阵,3个元素向量
  • cameraPosition是一个3x1*1x3矩阵乘法,是一个.. 3x3矩阵.我如何在opengl中使用这个简单glTranslatefglRotate调用?

c++ opengl opencv computer-vision pose-estimation

51
推荐指数
2
解决办法
4万
查看次数

OpenCV triangulatePoints用手

我有两个严格并排连接的摄像机,朝向平行方向.

摄像头的 投影矩阵左摄像头的投影矩阵

适用于相机的投影矩阵适用于右相机的投影矩阵

当我triangulatePoints对相应点的两个向量执行时,我得到了3D空间中的点集合.3D空间中的所有点都具有负Z坐标.

所以,要深究这个......

我的假设是OpenCV使用右手坐标系.

用户提醒: 用手提醒

我假设每个摄像机的初始方向指向正Z轴方向.

因此,通过使用像我在开头提出的那些投影矩阵,我会假设摄像机位于空间中,如下所示:

我怎么想象相机在太空中定位和定向

这个假设与我观察到的负数Z corrdinates的交错点时的观察结果相冲突.我能想到的唯一解释是OpenCV实际上使用左手坐标系.因此,对于我在开头所述的投影矩阵,这就是摄像机在太空中的定位方式:

左手坐标系中的摄像头

这表明我的左侧相机在这种情况下不在左侧.这就是为什么我得分为负的深度.

而且,如果我尝试triangulatePointssolvePnP我结合遇到问题.

我使用输出triangulatePoints作为输入solvePnP.我希望相机坐标靠近3D坐标系的原点.我希望计算出的相机位置与开头使用的投影矩阵相匹配.但这不会发生.我得到了一些完全狂野的结果,错过了预期值超过基线长度的10倍.

此示例比上述内容更完整地表示问题.

points3D 在此输入图像描述

以下是生成这些点的代码.

移动,设置相机A和相机D ...

Mat cameraMatrix = (Mat_<double>(3, 3) <<
    716.731, 0, 660.749,
    0, 716.731, 360.754,
    0, 0, 1);
Mat distCoeffs = (Mat_<double>(5, 1) << 0, 0, 0, 0, 0);



Mat rotation_a = Mat::eye(3, 3, CV_64F); // no rotation
Mat …
Run Code Online (Sandbox Code Playgroud)

c++ opencv triangulation

24
推荐指数
1
解决办法
3135
查看次数

如何将世界坐标转换为相机坐标?

我有一个输入3D矢量,以及相机的俯仰和偏航.任何人都可以描述或提供资源链接,以帮助我理解和实现所需的转换和矩阵映射吗?

opengl math 3d

14
推荐指数
2
解决办法
3万
查看次数

使用OpenCV Python计算相机世界位置

我想计算我的相机在世界坐标中的位置.这应该相当容易,但我没有得到我期望的结果.我相信我已经阅读了有关此主题的所有内容,但我的代码无效.这是我做的:

我有一个相机看着一个区域.

1)我画了一张该地区的地图.

2)我通过使用在我的地图上将4个图像点匹配到4个点来计算单应性 cv2.getPerspectiveTransform

3)H homography将每个世界坐标转换为摄像机坐标; 这是正常的

4)为了计算相机矩阵我遵循这个:

translation = np.zeros((3,1)) 
translation[:,0] = homography[:,2]

rotation = np.zeros((3,3))
rotation[:,0] = homography[:,0]
rotation[:,1] = homography[:,1]
rotation[:,2] = np.cross(homography[0:3,0],homography[0:3,1])

cameraMatrix = np.zeros((3,4))
cameraMatrix[:,0:3] = rotation
cameraMatrix[:,3] = homography[:,2]

cameraMatrix = cameraMatrix/cameraMatrix[2][3] #normalize the matrix
Run Code Online (Sandbox Code Playgroud)

5)根据这个,相机的位置应该这样计算:

x,y,z = np.dot(-np.transpose(rotation),translation)
Run Code Online (Sandbox Code Playgroud)

我得到的坐标是完全错误的.我想这个问题应该在步骤4或5的某个地方.我的方法有什么问题?

python opencv computer-vision homography augmented-reality

12
推荐指数
1
解决办法
1万
查看次数

如何使用3d-to-2d-points估计相机姿势(使用opencv)

您好我的目标是开发用于飞机(模拟器)驾驶舱的头部跟踪功能,以便提供AR以支持民用飞行员在恶劣的视觉条件下着陆和飞行.

我的方法是检测我知道3D坐标的特征点(在暗模拟器LED中),然后计算估计的(头戴式摄像机)姿势[R | t](旋转与翻译同步).

我所遇到的问题是估计的姿势似乎总是错误的,我的3D点(我也用来估计姿势)的投影不与2D图像点重叠(或不可见).

LED检测工作但不是姿势估计和3D投影

我的问题是:

如何使用给定的2D到3D点对应关系估计相机姿态.

为什么我的尝试不起作用,哪里可能是错误的来源?

为了使理论解决方案在现实环境中工作,测量(3D和2D点和相机矩阵)的准确度必须如何准确?

这种方法在理论上是否适用于共面点(x,y轴改变)?

我使用的硬件是Epson BT-200.

在飞机上我定义了一个固定的纵坐标,我希望我的程序可以实现相对平移和旋转.程序检测(唯一)LED的图像坐标,并将它们与相应的3D坐标相匹配.使用相机矩阵我使用open-cv示例android代码(https://github.com/Itseez/opencv/tree/master/samples/android/camera-calibration)我尝试使用solvePnP估计姿势.

我的相机矩阵和失真略有变化.以下是我从程序中收到的一些值.我确保打印出的圆形图案的圆距与源代码中记录的相同(以米为单位).

以下是一些示例以及如何创建它的OpenCV Mat.

//  protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
//          /*This matrix should have 5 values*/
//          0.04569467373955304,
//          0.1402980385369059,
//          0,
//          0,
//          -0.2982135315849994
//  };

//  protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
//          /*This matrix should have 5 values*/
//          0.08245931646421553,
//          -0.9893762277047577,
//          0,
//          0,
//          3.23553287438898
//  };

//  protected …
Run Code Online (Sandbox Code Playgroud)

java opencv computer-vision camera-calibration pose-estimation

8
推荐指数
1
解决办法
3787
查看次数

OpenCV:solvePnP tvec单位和轴方向

我试图找到相机相对于棋盘的相对位置(或者相反的方向) - 我觉得在不同的坐标系之间进行转换是合适的,例如这里建议的.我决定在这个阶段使用棋盘不仅用于校准而且还用于实际位置确定,因为我可以使用它findChessboardCorners来获得imagePoints(并且这可以正常工作).

我已经阅读了很多关于这个主题的内容,并且觉得我理解了solvePnP输出(即使我是openCV一般的新手和计算机视觉).不幸的是,我得到的结果solvePnP和物理测量测试设置的结果是不同的:z方向的平移偏差大约.25%.x并且y方向是完全错误的 - 几个数量级和不同的方向比我读到的相机坐标系统(x指向图像,y向右,z远离相机).所不同的坚持,如果我转换tvec,并rvec以相机姿态在世界坐标.

我的问题是:

  • 相机和世界坐标系轴的方向是什么?
  • 是否solvePnP以我指定的相同单位输出翻译objectPoints
  • 我将世界原点指定为objectPoints(棋盘角落之一)中的第一个.这样可以tvec从摄像机坐标转换到那个点吗?

这是我的代码(我附加备考,因为它不会抛出任何异常等).我使用灰度图像来获取校准期间的相机内在矩阵和失真系数,因此决定以灰度级执行本地化.chessCoordinates是一个棋盘点位置列表,以mm为单位,相对于原点(角点之一).camMatrixdistCoefficients来自校准(使用相同的棋盘和执行objectPoints).

camCapture=cv2.VideoCapture(0) # Take a picture of the target to get the imagePoints 
tempImg=camCapture.read()
imgPts=[]
tgtPts=[]

tempImg=cv2.cvtColor(tempImg[1], cv2.COLOR_BGR2GRAY)
found_all, corners = cv2.findChessboardCorners(tempImg, chessboardDim )

imgPts.append(corners.reshape(-1, 2))
tgtPts.append(np.array(chessCoordinates, dtype=np.float32))

retval,myRvec,myTvec=cv2.solvePnP(objectPoints=np.array(tgtPts), imagePoints=np.array(imgPts), cameraMatrix=camMatrix, distCoeffs=distCoefficients)
Run Code Online (Sandbox Code Playgroud)

python opencv coordinate-systems camera-calibration

5
推荐指数
1
解决办法
9288
查看次数

增强现实OpenGL + OpenCV

我是OpenCV的新手,对OpenGL的经验有限.我愿意将3D对象覆盖在棋盘的校准图像上.任何提示或指导?

opengl opencv layer augmented-reality camera-calibration

5
推荐指数
1
解决办法
1万
查看次数