OpenCV 矢量<point3f>到 3 列垫
opencv vector<point3f> to 3 column mat
我有point3f变量的2个向量(p1和p2),它们代表2个3D点云。为了匹配这两个点云,我想用SVD来找到一个变换。问题是SVD需要一个矩阵(p1*p2转置)。我的问题是如何将大小为Y的向量转换成Yx3矩阵?
我尝试cv::Mat p1Matrix(p1),但这给了我一个二维的行向量。我也发现了fitLine,但我认为这只适用于2D。
提前感谢。
不如这样写:
cv::Mat p1copy(3, p1.size(), CV_32FC1);
for (size_t i = 0, end = p1.size(); i < end; ++i) {
p1copy.at<float>(0, i) = p1[i].x;
p1copy.at<float>(1, i) = p1[i].y;
p1copy.at<float>(2, i) = p1[i].z;
}
如果这给了你想要的结果,你可以通过使用指针来代替相当慢的at<>()
函数来使代码更快。
我使用重塑函数将向量点转换为Mat.
vector<Point3f> P1,P2;
Point3f c1,c2;//center of two set
... //data association for two set
Mat A=Mat(P1).reshape(1).t();
Mat B=Mat(P2).reshape(1).t();
Mat AA,BB,CA,CB;
repeat(Mat(c1),1,P1.size(),CA);
repeat(Mat(c2),1,P2.size(),CB);
AA=A-CA;
BB=B-CB;
Mat H=AA*BB.t();
SVD svd(H);
Mat R_;
transpose(svd.u*svd.vt,R_);
if(determinant(R_)<0)
R_.at<float>(0,2)*=-1,R_.at<float>(1,2)*=-1,R_.at<float>(2,2)*=-1;
Mat t=Mat(c2)-R_*Mat(c1);
相关文章:
- 具有N列和N行的矩阵,列必须具有N-1、N-2等值
- 如何从棋盘上的箱号中找到行和列
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- EASTL矢量<向量<int>>连续的
- 打印第二列时的2d字符矢量打印空间
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 查找矩阵C++中每一列和每一行的最小和最大元素
- C++ 乔列斯基因式分解
- 如何删除给定矩阵中的特定行和列以进行C++?
- 对对应于矩阵的行和列的对向量进行排序
- 如何在C++中获取二维数组中最少的一列数?
- 如何在 c++ 中仅循环访问特定列?
- 是否可以在 QAbstractItemModel 中返回正数行数和零列数?
- 使用 GDAL 获取矢量数组中的所有行数和列数
- 如何修复CMFCPropertyListCtrl的列宽?
- 提升用于解析标题列的精神语法
- 如何读取没有数组或结构的 3 列文件
- 按列随机播放 2D 矢量
- 从简历垫中删除行或列的最佳方法是什么
- OpenCV 矢量<point3f>到 3 列垫