Konversi data cloud menjadi gambar 2d menggunakan OpenCV

Saya menggunakan OpenCV2(3.0.0) dengan IDE VS2013. Persyaratan saya adalah kita memiliki data cloud titik 3D (dengan parameter XYZ), dapatkah saya mengubah titik cloud 3d tersebut menjadi gambar 2d dan dapatkah kita mengonversi data cloud menjadi gambar menggunakan Opencv tanpa menghubungkan PCL.

Apa itu mungkin???

Jika memungkinkan, adakah yang bisa menyarankan saya cara mengonversi, dengan kode contoh OpenCV.

Setiap saran akan sangat membantu. Terima kasih sebelumnya


person KHV    schedule 18.11.2016    source sumber


Jawaban (1)


Pertanyaannya tidak begitu jelas. Apa yang Anda maksud dengan "mengonversi" titik cloud menjadi gambar 2d?
Saya berasumsi bahwa yang Anda maksud dengan "mengonversi" adalah proyek.
Dalam opencv, titik cloud, atau titik 3d apa pun dalam hal ini dapat berupa < kuat>diproyeksikan ke gambar 2D menggunakan projectpoints: http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#projectpoints.

Ini didasarkan pada model kamera lubang jarum, lihat di sini misalnya: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/FUSIELLO4/tutorial.html

Anda juga tidak dapat melihat pertanyaan ini: fungsi projectPoints OpenCV

Ingatlah bahwa Anda tidak akan dapat merekonstruksi data 3d asli Anda (karena informasi kedalaman hilang dalam proses proyeksi)

Untuk mempermudah, kita dapat menggunakan model proyeksi yang "sempurna" (tidak ada distorsi lensa kamera) dengan panjang fokus yang berubah-ubah (jika Anda ingin menampilkan gambar, Anda perlu bermain-main dengan panjang fokus sesuai dengan data Anda, sehingga nilai titik yang diproyeksikan tidak terlalu tinggi, misalnya tidak di atas 2048, yang merupakan lebar gambar beresolusi 2k).

Berikut ini contohnya:

#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
Terima kasih atas balasan Anda Daniel, saya sedang mengerjakannya dan jika saya menghadapi masalah, saya akan menghubungi Anda kembali. - person KHV; 21.11.2016