【opencv10】cv::Point:二维/三维点类

正如我们所知道的,opencv中的数据类型多由模板类进行创建,因此对于点类而言也是如此,支持各种类型如int,float等等的不同数据类型的point。点类的开销相对是很少的,因为该类上并未定义太多操纵,在需要的时候它们可以转化为更为一般的类型,例如固定向量类or固定矩阵类(之后讨论)。主要有两种模板,一种是二维的点,一种是三维的点。

一般通过下面的语句来实例化point对象。

cv::Point2i
cv::Point3f
语句中最后的i,f等所表达的意思为:
b是unsigned character,
s是short integer, 
i是32-bit integer,
f是32-bit floating-point number, 
d是64-bit floating-point number.

下表是一些point类直接支持的操作。

操作 例子(3可以换成2)
默认构造方法 cv::Point3i p;
拷贝构造方法 cv::Point3f p2( p1 );
带初始化值的构造方法 cv::Point3d p( x0, x1, x2 );
转换到固定向量类 (cv::Vec3f) p;
成员访问 p.x; p.y;p.z(2的时候没有z)
点积操作 float x
OpenCV中,将二维坐标转换为三维坐标通常需要一些额外的信息,比如相机的内参矩阵、畸变系数、以及相机相对于世界坐标系的位置和朝向(即旋转和平移矩阵)。这个过程通常涉及到从图像平面到三维空间的反投影。 OpenCV提供了一个函数`cv::triangulatePoints`,它可以用于从两个视图中三角化点。但在这之前,你需要使用相机的内参矩阵和畸变系数来将图像坐标转换为归一化图像平面坐标,然后才能进行三角化。 以下是一个大致的步骤说明: 1. **摄像机标定**:首先需要对摄像机进行标定,得到内参矩阵(`cameraMatrix`)和畸变系数(`distCoeffs`)。 2. **坐标变换**:使用`cv::undistortPoints`函数将图像坐标去畸变并转换为归一化相机坐标系中的坐标。 3. **三角化**:使用`cv::triangulatePoints`函数根据两个相机的视图和对应点,计算出三维空间中点的齐次坐标。 下面是一个简化的代码示例: ```cpp cv::Mat cameraMatrix1, cameraMatrix2, distCoeffs1, distCoeffs2; // 假设已经得到了两个相机的内参矩阵和畸变系数 std::vector<cv::Point2f> imagePoints1, imagePoints2; // 假设已经有了对应点集 cv::Mat R, T; // 假设已知两相机之间的旋转矩阵R和平移向量T cv::undistortPoints(imagePoints1, imagePoints1, cameraMatrix1, distCoeffs1); cv::undistortPoints(imagePoints2, imagePoints2, cameraMatrix2, distCoeffs2); imagePoints1 = imagePoints1.reshape(2, imagePoints1.size().area() / 2); imagePoints2 = imagePoints2.reshape(2, imagePoints2.size().area() / 2); cv::Mat point4DHomogeneous; cv::triangulatePoints(cameraMatrix1, cameraMatrix2, imagePoints1, imagePoints2, point4DHomogeneous); // 将齐次坐标转换为非齐次坐标 for (int i = 0; i < point4DHomogeneous.cols; i++) { cv::Mat point3D = (point4DHomogeneous.col(i) / point4DHomogeneous.at<float>(3, i)); // point3D 即为所求的三维坐标点 } ``` 请注意,这里的代码仅作示例,实际应用中需要根据具体情况调整,并确保所有矩阵和向量的维度和类型正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuanCruise

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值