#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;
}
1 回答
问题不是很清楚 . "convert"点 Cloud 到2d图像是什么意思?
我会假设"convert"你的意思是项目 .
在opencv中,使用
projectpoints
:http://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分辨率图像的宽度) .
这是一个例子: