我有一个校准过的相机(内在矩阵和失真系数),我想知道相机位置知道一些3d点及其在图像中的对应点(2d点).
我知道,cv::solvePnP
能帮助我,看完这个和这个我明白solvePnP的,我的产出rvec
和tvec
是对象在相机的旋转和平移坐标系.
所以我需要找出世界坐标系中的摄像机旋转/平移.
从上面的链接看来,代码在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++),但这对我来说没有多大意义:
glTranslatef
和glRotate
调用?我有两个严格并排连接的摄像机,朝向平行方向.
当我triangulatePoints
对相应点的两个向量执行时,我得到了3D空间中的点集合.3D空间中的所有点都具有负Z坐标.
所以,要深究这个......
我的假设是OpenCV使用右手坐标系.
我假设每个摄像机的初始方向指向正Z轴方向.
因此,通过使用像我在开头提出的那些投影矩阵,我会假设摄像机位于空间中,如下所示:
这个假设与我观察到的负数Z corrdinates的交错点时的观察结果相冲突.我能想到的唯一解释是OpenCV实际上使用左手坐标系.因此,对于我在开头所述的投影矩阵,这就是摄像机在太空中的定位方式:
这表明我的左侧相机在这种情况下不在左侧.这就是为什么我得分为负的深度.
而且,如果我尝试triangulatePoints
与solvePnP
我结合遇到问题.
我使用输出triangulatePoints
作为输入solvePnP
.我希望相机坐标靠近3D坐标系的原点.我希望计算出的相机位置与开头使用的投影矩阵相匹配.但这不会发生.我得到了一些完全狂野的结果,错过了预期值超过基线长度的10倍.
此示例比上述内容更完整地表示问题.
以下是生成这些点的代码.
移动,设置相机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) 我有一个输入3D矢量,以及相机的俯仰和偏航.任何人都可以描述或提供资源链接,以帮助我理解和实现所需的转换和矩阵映射吗?
我想计算我的相机在世界坐标中的位置.这应该相当容易,但我没有得到我期望的结果.我相信我已经阅读了有关此主题的所有内容,但我的代码无效.这是我做的:
我有一个相机看着一个区域.
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的某个地方.我的方法有什么问题?
您好我的目标是开发用于飞机(模拟器)驾驶舱的头部跟踪功能,以便提供AR以支持民用飞行员在恶劣的视觉条件下着陆和飞行.
我的方法是检测我知道3D坐标的特征点(在暗模拟器LED中),然后计算估计的(头戴式摄像机)姿势[R | t](旋转与翻译同步).
我所遇到的问题是估计的姿势似乎总是错误的,我的3D点(我也用来估计姿势)的投影不与2D图像点重叠(或不可见).
我的问题是:
如何使用给定的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
我试图找到相机相对于棋盘的相对位置(或者相反的方向) - 我觉得在不同的坐标系之间进行转换是合适的,例如这里建议的.我决定在这个阶段使用棋盘不仅用于校准而且还用于实际位置确定,因为我可以使用它findChessboardCorners
来获得imagePoints
(并且这可以正常工作).
我已经阅读了很多关于这个主题的内容,并且觉得我理解了solvePnP
输出(即使我是openCV
一般的新手和计算机视觉).不幸的是,我得到的结果solvePnP
和物理测量测试设置的结果是不同的:z方向的平移偏差大约.25%.x
并且y
方向是完全错误的 - 几个数量级和不同的方向比我读到的相机坐标系统(x指向图像,y向右,z远离相机).所不同的坚持,如果我转换tvec
,并rvec
以相机姿态在世界坐标.
我的问题是:
solvePnP
以我指定的相同单位输出翻译objectPoints
?objectPoints
(棋盘角落之一)中的第一个.这样可以tvec
从摄像机坐标转换到那个点吗?这是我的代码(我附加备考,因为它不会抛出任何异常等).我使用灰度图像来获取校准期间的相机内在矩阵和失真系数,因此决定以灰度级执行本地化.chessCoordinates
是一个棋盘点位置列表,以mm为单位,相对于原点(角点之一).camMatrix
和distCoefficients
来自校准(使用相同的棋盘和执行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) 我是OpenCV的新手,对OpenGL的经验有限.我愿意将3D对象覆盖在棋盘的校准图像上.任何提示或指导?