将矢量<point3d>转换为大小为(n x 3)的Mat,反之亦然

时间:2017-08-24 11:21:04

标签: c++ opencv point-clouds

我有Point3d(矢量)矢量形式的点云。如果我使用OpenCV提供的转换,例如

cv::Mat tmpMat = cv::Mat(pts) //Here pts is vector<cv::Point3d>

它被转换为具有3个通道的矩阵。我想要一个尺寸为nx3的单通道矩阵(n - 向量中的元素数)。有没有直接的方法将Point3d的矢量转换为大小为nx3的OpenCV Mat?

现在我正在做

cv::Mat1f tmpMat = cv::Mat::zeros(pts.size(), 3, cv::CV_32FC1);
for(int i = 0; i< pts.size(); ++i)
{
    tmpMat(i, 0) = pts[i].x;
    tmpMat(i, 1) = pts[i].y;
    tmpMat(i, 2) = pts[i].z;
}

从Mat到Point3d的矢量

vector<cv::Point3d> pts;
for (int i = 0; i < tmpMat.rows; ++i)
{
    pts.push_back(cv::Point3d(tmpMat(i, 0), tmpMat(i, 1), tmpMat(i, 2));
}

我会反复这样做。有没有更快的方法?

1 个答案:

答案 0 :(得分:2)

找到将3通道垫转换为

的单个通道垫尺寸(nx3)的方法

http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-reshape

cv::Mat tmpMat = cv::Mat(pts).reshape(1);

从尺寸为nx3的Mat转换为vector

vector<cv::Point3d> pts;
tmpMat.reshape(3, tmpMat.rows*tmpMat.cols).copyTo(pts);

向量的大小将等于Mat的行数