首页 文章

OpenCv C透视变换

提问于
浏览
3

我试图使用OpenCv来校正图像的失真,然后计算给定像素坐标的真实世界坐标 . 我无法在线或在OpenCv书中找到任何有关如何执行此操作的示例 .

我用国际象棋棋盘图像完成了相机校准 . 现在,我只需要一个基本功能,我可以给出像素坐标,它将根据相机矩阵,失真系数,旋转和平移向量给出真实世界坐标 .

有谁知道如何做到这一点?

4 回答

  • 6

    看一下 findHomography() 函数 . 如果您知道现实世界中一组点的位置,您可以使用此函数创建转换矩阵,您可以使用函数 perspectiveTransform()

    std::vector<Point2f> worldPoints;
    std::vector<Point2f> cameraPoints;
    
    //insert somepoints in both vectors
    
    Mat perspectiveMat_= findHomography(cameraPoints, worldPoints, CV_RANSAC);
    
    //use perspective transform to translate other points to real word coordinates
    
    std::vector<Point2f> camera_corners;
    //insert points from your camera image here
    
    std::vector<Point2f> world_corners;
    perspectiveTransform(camera_corners, world_corners, perspectiveMat_);
    

    您可以找到有关该功能的更多信息here

  • 0

    据我所知,你需要一个从图像点开始的世界点 . 使用单目相机这个问题是无法解决的 . 您无法确定相机的真实世界点的深度(距离) .

    有视觉同时定位和映射(SLAM)算法,可以创建世界 Map 并根据视频计算摄像机的轨迹,但它们是另一回事 .

  • 1

    给定单个图像及其上的点(以2D像素坐标表示),现实世界中存在无限的3D点,所有3D点都属于一条线,它映射到您图像中的点...不只是一个点 .

  • -1

    但是,如果您知道物体在像素(x,y)中与相机的距离,那么您可以在3D中计算其位置 .

相关问题