首页 文章

使用OpenCV将 Cloud 数据转换为2d图像

提问于
浏览
-1

我在IDE VS2013上使用OpenCV2(3.0.0) . 我的要求是我们有一个3D点 Cloud 数据(参数XYZ),我可以将这个三维点 Cloud 转换为二维图像,我们可以使用Opencv将 Cloud 数据转换为图像,而无需连接PCL .

可能吗???

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

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

1 回答

  • 1

    问题不是很清楚 . "convert"点 Cloud 到2d图像是什么意思?
    我会假设"convert"你的意思是项目 .
    在opencv中,使用 projectpointshttp://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#projectpoints,可以将点 Cloud 或任何3d点用于_210641_到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;
    }
    

相关问题