การแปลงข้อมูลคลาวด์เป็นภาพ 2 มิติโดยใช้ OpenCV

ฉันใช้ OpenCV2(3.0.0) กับ IDE VS2013 ข้อกำหนดของฉันคือเรากำลังมีข้อมูลคลาวด์พอยต์ 3 มิติ (พร้อมพารามิเตอร์ XYZ) ฉันสามารถแปลงพอยต์คลาวด์ 3 มิตินั้นเป็นรูปภาพ 2 มิติ และเราสามารถแปลงข้อมูลคลาวด์เป็นรูปภาพโดยใช้ Opencv โดยไม่ต้องลิงก์ PCL ได้หรือไม่

เป็นไปได้ไหม???

ถ้าเป็นไปได้ ใครสามารถแนะนำวิธีการแปลงให้ฉันด้วยโค้ดตัวอย่างของ OpenCV

ข้อเสนอแนะใด ๆ จะเป็นประโยชน์ ขอบคุณล่วงหน้า




คำตอบ (1)


คำถามไม่ชัดเจนจริงๆ คุณหมายถึงอะไรโดย "แปลง" point cloud เป็นภาพ 2d
ฉันจะถือว่า "แปลง" คุณหมายถึงโครงการ
ใน opencv point cloud หรือจุด 3 มิติใด ๆ สำหรับเรื่องนั้นอาจเป็น < strong>ฉายภาพลงบนภาพ 2 มิติโดยใช้ projectpoints: http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_restruction.html#projectpoints

ขึ้นอยู่กับรุ่นของกล้องรูเข็ม ลองดูตัวอย่างที่นี่: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/FUSIELLO4/tutorial.html

คุณไม่สามารถดูคำถามนี้ได้: ฟังก์ชัน projectPoints ของ OpenCV

โปรดทราบว่าคุณจะไม่สามารถสร้างข้อมูล 3 มิติต้นฉบับขึ้นมาใหม่ได้ (เนื่องจากข้อมูลเชิงลึกสูญหายไปในกระบวนการฉายภาพ)

เพื่อให้สิ่งต่าง ๆ ง่ายขึ้น เราสามารถใช้โมเดลการฉายภาพ "สมบูรณ์แบบ" (ไม่มีการบิดเบือนเลนส์กล้อง) ที่มีความยาวโฟกัสตามต้องการ (หากคุณต้องการแสดงภาพ คุณต้องลองใช้ความยาวโฟกัสตามข้อมูลของคุณ เช่น ค่าของจุดที่ฉายไว้ไม่สูงเกินไป เช่น ไม่เกิน 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;
}
person Daniel    schedule 18.11.2016
comment
ขอบคุณสำหรับคำตอบของคุณแดเนียล ฉันกำลังดำเนินการอยู่ และหากฉันประสบปัญหาใดๆ ฉันจะติดต่อกลับหาคุณ - person KHV; 21.11.2016