Získání pohled očí ptačí obrazu pomocí antény metadata

hlasů
1

Začínám metadata z bezpilotního prostředku spolu s obrazy z IR kamery. Metadata obsahují hřiště, svitek, parametry rotace vybočit a UAV GPS polohu a nadmořskou výšku. Vzhledem k UAV otáček není fotoaparát neustále prohlížení na nejnižší hodnotu.

Mým cílem je získat orthorectified snímků pomocí metadat a blížící se rovinný povrch terénu.

Narazil jsem na předchozí vlákno ( OpenCV prakticky kamera otáčí / překlady pro oko pohled ptačího ), která vysvětluje mnohé šedé oblasti okolo transformace obrazu. Nicméně jsem stále čelí některé problémy týkající se orthographic projekce obrazu na povrchu zem je.

Já používám OpenCV je funkce y * m ‚= A [R | t] M‘ s cílem získat z obrázku souřadnic svět souřadnic. Matice A, R, t jsou známé. Vzhledem k tomu, poloha pixel (x, y) Chci se dostat 3D povrch souřadnic v metrech. Poté, co jsem dostat souřadnic čtyř bodů, které definují svůj obrázek na zem, budu používat je dostat Homography a pokřivit můj obraz v pohledu očí ptačí perspektivy.

Můj kód je následující:

int RefEllipsoid = 23;
double UTMNorthing;
double UTMEasting;  
char UTMZone[4];

LLtoUTM(RefEllipsoid, m_uavLat, m_uavLon, UTMNorthing, UTMEasting, UTMZone);  ////Get UTMNNorthing, UTMEasting in meters
std::cout << UTMNorthing << \t << UTMEasting << \n;

cv::Mat source= frame.clone();  
cv::Mat destination;

double f = 500, dist = m_uavAlt;
double alpha, beta, gamma;
alpha = (m_yaw)*(3.1416/180);
beta = (m_pitch)*(3.1416/180);
gamma = (m_roll)*(3.1416/180);  

cv::Size taille = source.size();
double w = (double)taille.width, h = (double)taille.height;

// Rotation matrices around the X,Y,Z axis
///Yaw
cv::Mat RZ = (cv::Mat_<double>(3, 3) <<
    cos(alpha), -sin(alpha), 0,
    sin(alpha),  cos(alpha), 0,
    0,          0,           1);

///Pitch
cv::Mat RY = (cv::Mat_<double>(3, 3) <<
    cos(beta), 0, sin(beta), 
            0, 1,          0,
    -sin(beta), 0,  cos(beta));

///Roll
cv::Mat RX = (cv::Mat_<double>(3, 3) <<
    1,          0,           0,
    0, cos(gamma), -sin(gamma),
    0, sin(gamma),  cos(gamma));

// Composed rotation matrix with (RX,RY,RZ)
cv::Mat R = RZ * RY * RX;   

///translation vector
cv::Mat tvec = cv::Mat::zeros(3,1,cv::DataType<double>::type);
tvec.at<double>(0,0) = UTMEasting;
tvec.at<double>(1,0) = UTMNorthing;  
tvec.at<double>(2,0) = dist;

// Camera Intrisecs matrix 3D -> 2D
cv::Mat A2 = (cv::Mat_<double>(3,3) <<
    f, 0, w/2,
    0, f, h/2,
    0, 0,   1);

cv::Point2f src_vertices[4];
src_vertices[0] = cv::Point2f(0,0);
src_vertices[1] = cv::Point2f(w,0);
src_vertices[2] = cv::Point2f(0,h);
src_vertices[3] = cv::Point2f(w,h);

std::vector<cv::Point2f> ptV;
for(int i=0; i<4; i++) ptV.push_back(src_vertices[i]);

cv::Mat tempMat = (cv::Mat_<double>(3, 4) <<
    R.at<double>(0,0), R.at<double>(0,1), R.at<double>(0,2), tvec.at<double>(0,0),
    R.at<double>(1,0), R.at<double>(1,1), R.at<double>(1,2), tvec.at<double>(1,0),
    R.at<double>(2,0), R.at<double>(2,1), R.at<double>(2,2), tvec.at<double>(2,0));

cv::Point2f dst_vertices[4];

for(int i=0; i<4; i++)
 {
    cv::Mat uvPoint = cv::Mat::zeros(3,1,cv::DataType<double>::type); 
    uvPoint.at<double>(0,0) = ptV.at(i).x; 
    uvPoint.at<double>(1,0) = ptV.at(i).y;
    uvPoint.at<double>(2,0) = -f;

    cv::Mat P = (A2*tempMat).inv(cv::DECOMP_SVD);       

    cv::Mat out = P*uvPoint;

    dst_vertices[i].x = out.at<double>(0,0);
    dst_vertices[i].y = out.at<double>(1,0);        
}

cv::Mat warpMatrix = getPerspectiveTransform(src_vertices, dst_vertices);

cv::Mat rotated;
cv::warpPerspective(source, rotated, warpMatrix, rotated.size(), cv::INTER_LINEAR, cv::BORDER_CONSTANT);

cv::imshow(final, rotated);   
cv::waitKey(0);

Bohužel body, které jsem stále jsou daleko od toho, co jsem se očekávat, že i oni se zdají být hodně blízko u sebe a od polohy UAV (vyjádřené v UTM). například pro UAV nadmořské výšce 400m jsem dostat všechny obrazové pozice u kolem (225, -37). Může mi někdo pomoct s tím, že máte nějaké návrhy na to, co dělám špatně?

Položena 09/04/2015 v 15:51
zdroj uživatelem
V jiných jazycích...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more