gpt4 book ai didi

c++ - opencv triangulatePoints,奇怪的结果

转载 作者:太空狗 更新时间:2023-10-29 21:40:41 30 4
gpt4 key购买 nike

我在 opencv 中使用 triagulatePoints 函数。在绝望之后,我终于让它工作了,但结果看起来并不正确。我已经阅读了一些关于此的其他问题,但我仍然不明白!

我在运行:

cv::Mat Q,P1,P2,LP,RP,D1,D2,M1,M2;
char *CALIB_FILE = (char *)"extrinsics.xml";
FileStorage fs(CALIB_FILE, FileStorage::READ);
fs["Q"] >> Q;
fs["P1"] >> P1;
fs["P2"] >> P2;


cv::Mat cam0pnts(1, 5, CV_64FC2); //681 432 479 419 550 320 682 274 495 254
cv::Mat cam1pnts(1, 5, CV_64FC2); //800 466 587 451 657 352 791 311 592 283

cv::Mat points_3D(1, 5, CV_64FC4);


cv::triangulatePoints(P1, P2, cam0pnts, cam1pnts, points_3D);

P1 和 P2 是从 stereo_calib 函数计算出的外参。

有 5 个点,一个粗略的正方形,每个角各有一个点,中间各有一个点。

生成的矩阵是:

 [-0.6620691274599629, 0.6497615623177577, -0.6585234150236594, 0.6529909432980171, -0.6604373884239706;
-0.7091492226203088, 0.7208075295879011, -0.7119285643550911, 0.7174438199266364, -0.710244308941275;
0.242429054072024, -0.2413429417514131, 0.2439357048056051, -0.2426462227979475, 0.2436708320163396;
-6.52928664505207e-005, -4.348043360405063e-005, -5.515313727475824e-005, -6.149577656504346e-005, -5.668087253108842e-005]

其中,在 3d 中绘制时,给出了两个看起来几乎正确的位置,如果比例完全错误,那么这两个位置的三个拷贝。

我哪里错了?我需要对结果矩阵做些什么来获得 xyz 坐标吗?还是我错误地实现了功能?

最佳答案

取消它,我设法通过忽略 cv::triangulate 函数并在此处使用此方法来做到这一点:

http://www.morethantechnical.com/2012/01/04/simple-triangulation-with-opencv-from-harley-zisserman-w-code/

通过一个小改动来修复一些错误位置的代码...

Mat_<double> IterativeLinearLSTriangulation(Point3d u,    //homogenous image point (u,v,1)
Matx34d P, //camera 1 matrix
Point3d u1, //homogenous image point in 2nd camera
Matx34d P1 //camera 2 matrix
) {

double wi = 1, wi1 = 1;
Mat_<double> X(4, 1);



for (int i = 0; i < 10; i++) { //Hartley suggests 10 iterations at most
Mat_<double> X_ = LinearLSTriangulation(u, P, u1, P1);
X(0) = X_(0); X(1) = X_(1); X(2) = X_(2); X(3) = 1.0;
//recalculate weights
double p2x = Mat_<double>(Mat_<double>(P).row(2)*X)(0);
double p2x1 = Mat_<double>(Mat_<double>(P1).row(2)*X)(0);

//breaking point
if (fabsf(wi - p2x) <= EPSILON && fabsf(wi1 - p2x1) <= EPSILON) break;

wi = p2x;
wi1 = p2x1;

//reweight equations and solve
Matx43d A((u.x*P(2, 0) - P(0, 0)) / wi, (u.x*P(2, 1) - P(0, 1)) / wi, (u.x*P(2, 2) - P(0, 2)) / wi,
(u.y*P(2, 0) - P(1, 0)) / wi, (u.y*P(2, 1) - P(1, 1)) / wi, (u.y*P(2, 2) - P(1, 2)) / wi,
(u1.x*P1(2, 0) - P1(0, 0)) / wi1, (u1.x*P1(2, 1) - P1(0, 1)) / wi1, (u1.x*P1(2, 2) - P1(0, 2)) / wi1,
(u1.y*P1(2, 0) - P1(1, 0)) / wi1, (u1.y*P1(2, 1) - P1(1, 1)) / wi1, (u1.y*P1(2, 2) - P1(1, 2)) / wi1
);
Mat_<double> B = (Mat_<double>(4, 1) << -(u.x*P(2, 3) - P(0, 3)) / wi,
-(u.y*P(2, 3) - P(1, 3)) / wi,
-(u1.x*P1(2, 3) - P1(0, 3)) / wi1,
-(u1.y*P1(2, 3) - P1(1, 3)) / wi1
);

solve(A, B, X_, DECOMP_SVD);
X(0) = X_(0); X(1) = X_(1); X(2) = X_(2); X(3) = 1.0;
}

return X;
}

还有这个:

Mat_<double> LinearLSTriangulation(Point3d u,       //homogenous image point (u,v,1)
Matx34d P, //camera 1 matrix
Point3d u1, //homogenous image point in 2nd camera
Matx34d P1 //camera 2 matrix
)
{
//build matrix A for homogenous equation system Ax = 0
//assume X = (x,y,z,1), for Linear-LS method
//which turns it into a AX = B system, where A is 4x3, X is 3x1 and B is 4x1
Matx43d A(u.x*P(2, 0) - P(0, 0), u.x*P(2, 1) - P(0, 1), u.x*P(2, 2) - P(0, 2),
u.y*P(2, 0) - P(1, 0), u.y*P(2, 1) - P(1, 1), u.y*P(2, 2) - P(1, 2),
u1.x*P1(2, 0) - P1(0, 0), u1.x*P1(2, 1) - P1(0, 1), u1.x*P1(2, 2) - P1(0, 2),
u1.y*P1(2, 0) - P1(1, 0), u1.y*P1(2, 1) - P1(1, 1), u1.y*P1(2, 2) - P1(1, 2)
);
Mat_<double> B = (Mat_<double>(4, 1) << -(u.x*P(2, 3) - P(0, 3)),
-(u.y*P(2, 3) - P(1, 3)),
-(u1.x*P1(2, 3) - P1(0, 3)),
-(u1.y*P1(2, 3) - P1(1, 3)));

Mat_<double> X;
solve(A, B, X, DECOMP_SVD);

return X;
}

关于c++ - opencv triangulatePoints,奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30493928/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com