首页 文章

使用计算单应性将2D点从标记投影到图像

提问于
浏览
6

我有一个平面标记,我运行 SIFT 算法来提取特征 . 然后我运行一个探测器在场景中找到这个标记并再次提取特征 . 我匹配这些点并使用 findHomography() 从匹配的对中提取 homography 与OpenCV .

现在我想用计算的单应性投影在标记中检测到的2D点,以将位置与从场景测量的3D点进行比较并计算 reprojection error . 我对像素坐标,厘米,校准矩阵感到困惑,我不知道我应该先做哪些转换 .

有人知道这方面的链接还是可以解释方法?

1 回答

  • 6

    如果你调用单应矩阵H,相机矩阵K(需要转换为像素)将是这样的,取决于你的分辨率 .

    Mat K= Mat::zeros(3,3,CV_32FC1);
    K.at<float>(0,0)=500.0f;        
    K.at<float>(0,2)=320.0f;      // width/2    
    K.at<float>(1,1)=500.0f;    
    K.at<float>(1,2)=240.0f;      // height/2 
    K.at<float>(2,2)=1.0f;
    

    如果您的标记点是2D的矢量点:

    vector<Point2f> marker_point; //containing coordinates in centimeters
    

    那么投影将是这样的,结果是像素坐标中的3D点 .

    Mat point(3,1,CV_32FC1);        
    point.at<float>(0) = marker_point.x;
    point.at<float>(1) = marker_point.y;
    point.at<float>(2) = 1.0f;
    point = H* point;
    point = point/point.at<float>(2);       //Normalize
    point = K* point;                   //to pixels
    

相关问题