标签: pose-estimation

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

我有一个任务是在3D坐标系中定位一个对象.由于我必须得到几乎精确的X和Y坐标,我决定使用已知的Z坐标跟踪一个颜色标记,该坐标将放置在移动对象的顶部,如此图片中的橙色球: undistored

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

std::vector<cv::Point2f> imagePoints;
std::vector<cv::Point3f> objectPoints;
//img points are green dots in the picture
imagePoints.push_back(cv::Point2f(271.,109.));
imagePoints.push_back(cv::Point2f(65.,208.));
imagePoints.push_back(cv::Point2f(334.,459.));
imagePoints.push_back(cv::Point2f(600.,225.));

//object points are measured in millimeters because calibration is done in mm also
objectPoints.push_back(cv::Point3f(0., 0., 0.));
objectPoints.push_back(cv::Point3f(-511.,2181.,0.));
objectPoints.push_back(cv::Point3f(-3574.,2354.,0.));
objectPoints.push_back(cv::Point3f(-3400.,0.,0.));

cv::Mat rvec(1,3,cv::DataType<double>::type);
cv::Mat tvec(1,3,cv::DataType<double>::type);
cv::Mat rotationMatrix(3,3,cv::DataType<double>::type);

cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec);
cv::Rodrigues(rvec,rotationMatrix);
Run Code Online (Sandbox Code Playgroud)

拥有所有矩阵之后,这个可以帮助我转换图像的方程指向wolrd坐标:

transform_equation

其中M是cameraMatrix,R - rotationMatrix,t - tvec和s是未知的.Zconst表示橙色球的高度,在本例中为285毫米.所以,首先我需要解决前面的方程,得到"s",然后通过选择图像点找出X和Y坐标: 方程2

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

cv::Mat uvPoint = (cv::Mat_<double>(3,1) << 363, 222, 1); // u = 363, v = 222, got this point using mouse callback …
Run Code Online (Sandbox Code Playgroud)

opencv camera-calibration pose-estimation

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

来自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万
查看次数

如果已知外部和内部参数,则从2D图像像素获取3D坐标

我正在从tsai algo做相机校准.我有内在和外在矩阵,但我怎样才能从该信息中重建三维坐标?

在此输入图像描述

1) 我可以使用高斯消元法找到X,Y,Z,W,然后将点作为齐次系统的X/W,Y/W,Z/W.

2)我可以使用 OpenCV文档方法:

在此输入图像描述

因为我知道u,v,R,t,我可以计算X,Y,Z.

然而,这两种方法最终都会产生不正确的结果.

我做错了什么?

c++ opencv homogenous-transformation camera-calibration pose-estimation

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

您可以将 OpenCV solvePNP 与等距柱状图一起使用吗?

是否可以将 OpenCV 的 solvePNP 与 equirectangular图像一起使用?我有一个 equirectangular 图像,我在这个图像中有四个点(红点)和它们的像素坐标,然后我有 4 个对应的世界点,例如[(0, 0, 0), (2, 0, 0), (2, 10, 0), (0, 10, 0)]我如何估计相机姿势?

在此处输入图片说明

我尝试使用 OpenCV,solvePnp但是期望 Brown 相机模型的内在函数,所以没有用。这可以用于球形相机吗?

python opencv pose-estimation opencv-solvepnp

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

相机姿态估计(OpenCV PnP)

我试图通过使用我的网络摄像头从具有已知全球位置的四个基准点的图像中获得全局姿势估计.

我检查了很多stackexchange问​​题和一些文章,我似乎无法得到一个正确的解决方案.我得到的位置编号是可重复的,但绝不与摄像机移动成线性比例.仅供参考我使用的是C++ OpenCV 2.1.

在这个链接上描绘了我的坐标系和下面使用的测试数据.

% Input to solvePnP():
imagePoints =     [ 481, 831; % [x, y] format
                    520, 504;
                   1114, 828;
                   1106, 507]
objectPoints = [0.11, 1.15, 0; % [x, y, z] format
                0.11, 1.37, 0; 
                0.40, 1.15, 0;
                0.40, 1.37, 0]

% camera intrinsics for Logitech C910
cameraMat = [1913.71011, 0.00000,    1311.03556;
             0.00000,    1909.60756, 953.81594;
             0.00000,    0.00000,    1.00000]
distCoeffs = [0, 0, 0, 0, 0]

% output of solvePnP():
tVec = [-0.3515;
         0.8928; 
         0.1997]

rVec = [2.5279; …
Run Code Online (Sandbox Code Playgroud)

opencv computational-geometry camera-calibration pose-estimation extrinsic-parameters

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

如何确定相机的世界坐标?

我有一个已知尺寸和位置在墙上的矩形目标,以及机器人上的移动摄像头.当机器人在房间里行驶时,我需要找到目标并计算摄像机的位置及其姿势.另外,使用伺服系统可以改变摄像机的高度和方位角.我能够使用OpenCV定位目标,但我仍然模糊计算摄像机的位置(实际上,我的额头上有一个平坦的位置,因为上周我的头撞在墙上).这是我在做的事情:

  1. 读入先前计算的相机内在文件
  2. 从轮廓中获取目标矩形的4个点的像素坐标
  3. 使用矩形的世界坐标,像素坐标,相机矩阵和失真矩阵调用solvePnP
  4. 使用旋转和平移向量调用projectPoints
  5. ???

我已经阅读了OpenCV书籍,但我想我只是遗漏了一些如何使用投影点,旋转和平移向量来计算相机的世界坐标及其姿势(我不是数学专家): - (

2013-04-02根据"morynicz"的建议,我写了这个简单的独立程序.

#include <Windows.h>
#include "opencv\cv.h"

using namespace cv;

int main (int argc, char** argv)
{
const char          *calibration_filename = argc >= 2 ? argv [1] : "M1011_camera.xml";
FileStorage         camera_data (calibration_filename, FileStorage::READ);
Mat                 camera_intrinsics, distortion;
vector<Point3d>     world_coords;
vector<Point2d>     pixel_coords;
Mat                 rotation_vector, translation_vector, rotation_matrix, inverted_rotation_matrix, cw_translate;
Mat                 cw_transform = cv::Mat::eye (4, 4, CV_64FC1);


// Read camera data
camera_data ["camera_matrix"] >> camera_intrinsics;
camera_data ["distortion_coefficients"] >> distortion;
camera_data.release ();

// Target rectangle coordinates in feet …
Run Code Online (Sandbox Code Playgroud)

opencv pose-estimation

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

如何使用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
查看次数

3D 旋转分布的平均值和测量

我见过几个类似的问题,并对我可能尝试的内容有一些想法,但我不记得看到过任何有关传播的内容。

所以:我正在开发一个测量系统,最终基于计算机视觉。

我进行 N 个捕获,并使用一个库来处理它们,该库以平移和旋转的 4x4 仿射变换矩阵的形式输出姿势估计。

这些姿势估计中有一些噪音。每个旋转轴的欧拉角的标准偏差小于 2.5 度,因此所有方向都非常接近(对于所有欧拉角都接近 0 或 180 的情况)。小于 0.25 度的标准误差对我来说很重要。但我已经遇到了欧拉角特有的问题。

我想对所有这些非常接近的姿势估计进行平均以获得单个最终姿势估计。我还想找到一些传播的衡量标准,以便我可以估计准确性。

我知道“平均”对于轮换实际上并没有很好的定义。

(郑重声明,我的代码是使用 Numpy 的 Python 编写的。)

我也可能想对这个平均值进行加权,因为已知某些捕获(和某些轴)比其他捕获更准确。

我的印象是,我可以只取平移向量的平均值和标准差,对于旋转,我可以转换为四元数,取平均值,并以良好的精度重新归一化,因为这些四元数非常接近。

我还听说过所有四元数中的最小二乘法,但我对如何实现这一点的大部分研究都以惨败告终。

这可行吗?在这种情况下是否有一个合理明确的传播衡量标准?

geometry quaternions affinetransform rotational-matrices pose-estimation

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

足球场的同形异义词

好的,所以我想找到足球比赛的单应性.我现在拥有的是

  1. 从文件夹中读取图像,该文件夹基本上是模板足球场的多个裁剪图像.基本上这有中心圆和罚球线等图像.
  2. 从文件中读取视频流并将其裁剪为许多较小的片段.
  3. 在视频流中的图像内循环,并在我从文件夹中读取的图像的另一个循环内部.
  4. 现在在我通过迭代得到的两个图像中,我应用了绿色滤镜,因为我假设场是绿色的
  5. 使用orb查找点然后找到匹配项.

现在的问题是,由于玩家和来自骄傲的一些噪音,我无法找到适当的单词匹配.同时移除它们也是一个问题,因为这也会隐藏我需要计算单应性的足球场线.

对此有任何建议非常感谢.以下是我正在使用的一些示例代码和图像.

"正在使用的代码"

样本图片

http://i65.tinypic.com/21cs9rl.png

我得到的输出

http://i66.tinypic.com/zj6ljo.png

输出右侧的图像是来自视频的帧,左侧的图像是我在filterGreen函数之后上传的相同样本图像,如从代码中可以看到的.

最后我想要的是图像正确映射到中心圆所以我可以在中心绘制一个立方体,有点类似于"这个例子".在此先感谢帮助我.

python opencv homography pose-estimation

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

如何使用 OpenCV 理解 Python 中的头部姿势估计角度?

我正在完成此处找到的 Python 和 OpenCV 头部姿势估计教程:

https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/

我能够准确地将 3D 点投影到 2D 图像上。但是,我无法理解我使用计算的欧拉角(偏航、俯仰、滚转)的实际含义cv2.decomposeProjectionMatrix

我需要知道这些值是否对应于 (yaw, pitch, roll) 或 (roll, pitch, yaw) 等。此外,我需要了解所使用的轴方向,以便我知道旋转度数在哪里从测量。

输出图像https : //www.learnopencv.com/wp-content/uploads/2016/09/head-pose-example-1024x576.jpg

输出角度[[-179.30011146], [ 53.77756583], [-176.6277211 ]]

这是我的代码

# --- Imports ---
import cv2
import numpy as np
# --- Main ---
if __name__ == "__main__":

    # Read Image
    im = cv2.imread("headPose.jpg");
    size = im.shape

    #2D image points. If you change the image, you need to change vector
    image_points = np.array([
                                (359, 391),     # …
Run Code Online (Sandbox Code Playgroud)

python opencv euler-angles pose-estimation

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