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