【问题标题】:OpenCv C++ Perspective TransformOpenCv C++ 透视变换
【发布时间】:2011-08-26 02:53:39
【问题描述】:

我正在尝试使用 OpenCv 来校正图像的失真,然后在给定像素坐标的情况下计算真实世界的坐标。我在网上或 OpenCv 书中找不到任何关于如何执行此操作的示例。

我已经用棋盘图像完成了相机校准。现在,我只需要一个基本函数,我可以为其提供像素坐标,它将根据相机矩阵、畸变系数、旋转和平移向量为我提供真实世界的坐标。

有人知道怎么做吗?

【问题讨论】:

标签: c++ opencv camera camera-calibration


【解决方案1】:

看看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的信息

【讨论】:

  • @dilip_thomas 我怎样才能找到真实世界的积分?我需要知道将其传递给 findHomography 函数。
【解决方案2】:

据我了解,您需要一个来自图像点的世界点。对于单目相机,这个问题是无法解决的。您无法确定现实世界点到相机的深度(距离)。

有视觉同步定位和映射 (SLAM) 算法可以创建世界地图并根据视频计算相机的轨迹,但它们完全是另一回事。

【讨论】:

    【解决方案3】:

    给定单个图像和其上的一个点,以 2D 像素坐标表示,现实世界中有无数个 3D 点,它们都属于一条线,映射到图像中的点...不只是一点。

    【讨论】:

      【解决方案4】:

      但是,如果您知道对象与相机的距离(以像素 (x,y) 为单位),则可以计算其 3D 位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 2018-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        相关资源
        最近更新 更多