opencv - 世界坐标到相机坐标到像素坐标
问题描述
我正在尝试将一个给定的 3D 点投影到图像平面,我已经发布了很多关于此的问题,很多人帮助我,我也阅读了许多相关链接,但投影仍然无法正常工作。
我有一个 3d 点 (-455,-150,0),其中 x 是深度轴,z 是向上轴,y 是我滚动的水平点:绕前后轴 (x) 旋转,俯仰:围绕左右轴(y)旋转和偏航:围绕垂直轴(z)旋转我也有相机上的位置(x,y,z)=(-50,0,100)所以我在做以下首先我使用外部参数从世界坐标到相机坐标:
double pi = 3.14159265358979323846;
double yp = 0.033716827630996704* pi / 180; //roll
double thet = 67.362312316894531* pi / 180; //pitch
double k = 89.7135009765625* pi / 180; //yaw
double rotxm[9] = { 1,0,0,0,cos(yp),-sin(yp),0,sin(yp),cos(yp) };
double rotym[9] = { cos(thet),0,sin(thet),0,1,0,-sin(thet),0,cos(thet) };
double rotzm[9] = { cos(k),-sin(k),0,sin(k),cos(k),0,0,0,1};
cv::Mat rotx = Mat{ 3,3,CV_64F,rotxm };
cv::Mat roty = Mat{ 3,3,CV_64F,rotym };
cv::Mat rotz = Mat{ 3,3,CV_64F,rotzm };
cv::Mat rotationm = rotz * roty * rotx; //rotation matrix
cv::Mat mpoint3(1, 3, CV_64F, { -455,-150,0 }); //the 3D point location
mpoint3 = mpoint3 * rotationm; //rotation
cv::Mat position(1, 3, CV_64F, {-50,0,100}); //the camera position
mpoint3=mpoint3 - position; //translation
现在我想从相机坐标移动到图像坐标
第一个解决方案是:正如我从一些来源中读到的
Mat myimagepoint3 = mpoint3 * mycameraMatrix;
这没有用
第二个解决方案是:
double fx = cameraMatrix.at<double>(0, 0);
double fy = cameraMatrix.at<double>(1, 1);
double cx1 = cameraMatrix.at<double>(0, 2);
double cy1= cameraMatrix.at<double>(1, 2);
xt = mpoint3 .at<double>(0) / mpoint3.at<double>(2);
yt = mpoint3 .at<double>(1) / mpoint3.at<double>(2);
double u = xt * fx + cx1;
double v = yt * fy + cy1;
但也没有用
我还尝试使用opencv方法fisheye::projectpoints(从世界到图像坐标)
Mat recv2;
cv::Rodrigues(rotationm, recv2);
//inputpoints a vector contains one point which is the 3d world coordinate of the point
//outputpoints a vector to store the output point
cv::fisheye::projectPoints(inputpoints,outputpoints,recv2,position,mycameraMatrix,mydiscoff );
但这也没有用
不起作用我的意思是:我知道(在图像中)该点应该出现在哪里但是当我绘制它时,它总是在另一个地方(甚至不接近)有时我什至得到一个负值
注意:没有语法错误或异常,但是我在这里编写代码时可能会打错字,所以有人可以建议我是否做错了什么?
解决方案
推荐阅读
- r - 带有标签名称的摘要与 dplyr
- c++ - 使用 OpenCV 和 librealsense 制作 C++ 项目
- node.js - 在 chokidar.on() 回调中运行 gulp 任务
- sql - 从具有 10000 行的表中选择每个前 1 行和第 100 行值
- python - 模块未找到 Python 3.6.5、Spyder 3.2.8
- html - 无法为 d3 折线图的标签获得正确的输出
- ios - 使用uiview在collectionview中拉起重新加载
- ios - Dictionary [String: String] keys order changed when converted to array swift
- python - 最大值在哪里?
- java - java编程主显示错误341