Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 世界坐标到摄影机坐标到像素坐标_Opencv_Projection - Fatal编程技术网

Opencv 世界坐标到摄影机坐标到像素坐标

Opencv 世界坐标到摄影机坐标到像素坐标,opencv,projection,Opencv,Projection,我正在尝试将一个给定的3D点投影到图像平面上,我已经发布了很多关于这个的问题,很多人都在帮助我,我也阅读了很多相关的链接,但是投影仍然不能正确地为我工作 我有一个3d点(-455,-150,0),其中x是深度轴,z是向上轴,y是水平轴,滚动:围绕前后轴旋转(x),俯仰:围绕左右轴旋转(y)和偏航:绕垂直轴(z)旋转我还有相机上的位置(x,y,z)=(-50,0100),所以我做以下操作 首先,我使用外部参数从世界坐标到摄影机坐标: double pi = 3.14159265358979

我正在尝试将一个给定的3D点投影到图像平面上,我已经发布了很多关于这个的问题,很多人都在帮助我,我也阅读了很多相关的链接,但是投影仍然不能正确地为我工作

我有一个3d点(-455,-150,0),其中x是深度轴,z是向上轴,y是水平轴,滚动:围绕前后轴旋转(x),俯仰:围绕左右轴旋转(y)偏航:绕垂直轴(z)旋转我还有相机上的位置(x,y,z)=(-50,0100),所以我做以下操作 首先,我使用外部参数从世界坐标到摄影机坐标:

    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;
但这也不起作用

我的意思是:我知道(在图像中)点应该出现在哪里,但当我画它时,它总是在另一个地方(甚至不接近),有时我甚至得到负值

注意:这里没有语法错误或异常,但我在这里写代码时可能会打字错误吗 那么,有人能建议我是否做错了什么吗

 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 );