мировые координаты в координаты камеры в пиксельные координаты - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь спроецировать отдающую трехмерную точку на плоскость изображения, я отправил много вопросов по этому поводу, и многие люди помогают мне, также я прочитал много связанных ссылок, но все же проекция не работает для меня правильно.

У меня есть 3d-точка (-455, -150,0), где x - это ось глубина , а z - это направленная вверх ось, а y - это горизонтальная один у меня рулон: вращение вокруг передней оси (x) , шаг: вращение вокруг боковой оси (y) и рыскание: вращение вокруг вертикальной оси (z) также у меня есть положение на камере (x, y, z) = (- 50,0100), поэтому сначала я делаю следующее, начиная с мировых координат и заканчивая камерой координаты с использованием параметров extrinsi c:

    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;

это не сработало

второе решение было * 102 8 *:

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

но это тоже не сработало

не сработало, я имею в виду: я знаю (на картинке), где должна появиться точка, но когда я рисую ее, она всегда находится в другом месте (даже близко) ) иногда я даже получаю отрицательные значения

примечание: нет синтаксических ошибок или исключений, но я могу сделать опечатки, пока пишу код, поэтому кто-нибудь может подсказать, если я что-то делаю неправильно?

...