【问题标题】:Conversion of cloud data into 2d image using OpenCV使用 OpenCV 将云数据转换为 2d 图像
【发布时间】:2017-04-02 07:21:39
【问题描述】:

我在 IDE VS2013 中使用 OpenCV2(3.0.0)。我的要求是我们有一个 3D 点云数据(带有参数 XYZ),我可以将该 3D 点云转换为 2d 图像吗?我们可以使用 Opencv 将云数据转换为图像,而无需链接 PCL。

有可能吗???

如果可能的话,任何人都可以建议我如何转换,使用 OpenCV 的示例代码。

任何建议都会有所帮助 在此先感谢

【问题讨论】:

    标签: c++ visual-studio-2010 opencv visual-studio-2013 point-cloud-library


    【解决方案1】:

    这个问题不是很清楚。将点云“转换”为二维图像是什么意思?
    我假设“转换”是指项目。
    在 opencv 中,可以使用projectpoints:http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#projectpoints 将点云或任何 3d 点投影到 2d 图像上。

    这是基于针孔相机模型,看这里例如: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/FUSIELLO4/tutorial.html

    这个问题你也不能看: OpenCV's projectPoints function

    请记住,您将无法重建原始 3D 数据(因为在投影过程中丢失了深度信息)

    为简化起见,我们可以使用具有任意焦距的“完美”投影模型(没有相机镜头失真)(如果您希望显示图像,则需要根据您的数据调整焦距,这样投影点的值不会太高,例如不高于 2048,这是 2k 分辨率图像的宽度。

    这是一个例子:

    #include <string>
    #include "opencv2/opencv.hpp"
    using namespace cv;
    using namespace std;
    
    
    std::vector<cv::Point3d> Generate3DPoints();
    
    int main(int argc, char* argv[])
    {
        // Read 3D points
        std::vector<cv::Point3d> objectPoints = Generate3DPoints();
        std::vector<cv::Point2d> imagePoints;
    
        int f = 5;  //focal length
    
        for (unsigned int i = 0; i < objectPoints.size(); i++)
        {
            cv::Point3d orig_point = objectPoints[i];
            imagePoints.push_back(cv::Point2d(
                f*orig_point.x / orig_point.z,  //x' = f*x/z
                f*orig_point.y / orig_point.z)  //y' = f*y/z
                );
        }
    }
    
    std::vector<cv::Point3d> Generate3DPoints()
    {
        std::vector<cv::Point3d> points;
    
        double x, y, z;
    
        x = .5; y = .5; z = -.5;
        points.push_back(cv::Point3d(x, y, z));
    
        x = .5; y = .5; z = .5;
        points.push_back(cv::Point3d(x, y, z));
    
        x = -.5; y = .5; z = .5;
        points.push_back(cv::Point3d(x, y, z));
    
        x = -.5; y = .5; z = -.5;
        points.push_back(cv::Point3d(x, y, z));
    
        x = .5; y = -.5; z = -.5;
        points.push_back(cv::Point3d(x, y, z));
    
        x = -.5; y = -.5; z = -.5;
        points.push_back(cv::Point3d(x, y, z));
    
        x = -.5; y = -.5; z = .5;
        points.push_back(cv::Point3d(x, y, z));
    
        for (unsigned int i = 0; i < points.size(); ++i)
        {
            std::cout << points[i] << std::endl << std::endl;
        }
    
        return points;
    }
    

    【讨论】:

    • 感谢您的回复丹尼尔,我正在努力,如果我遇到任何问题,我会回复您。
    猜你喜欢
    • 2015-06-26
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多