我想优雅地转换Mat tov Vec3f。目前我这样做:
Mat line;
Vec3f ln;
ln[0] = line.at<float>(0, 0);
ln[1] = line.at<float>(0, 1);
ln[2] = line.at<float>(0, 2);
有更好的方法吗?
答案 0 :(得分:4)
在评论中,您指定这是一个大小为3x1的单通道浮点矩阵。我明确了解代码中的数据类型,因此我用cv::Mat1f
代表它。
现在,由于它是单一渠道矩阵,我们无法直接访问Vec3f
元素,因为如果输入Mat
是子矩阵,我们就会错误结果。我们可以使用cv::Mat::reshape
有效地将输入转换为3通道Mat
,然后使用cv::Mat::at
访问第一个元素。
示例代码:
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat1f m(3, 1);
m << 1.0f , 2.0f , 3.0f;
cv::Vec3f v(m.reshape(3).at<cv::Vec3f>());
std::cout << "m=" << m << "\n";
std::cout << "v=" << v << "\n";
return 0;
}
输出:
m=[1;
2;
3]
v=[1, 2, 3]
老实说,编写一个简短的实用程序函数来执行此操作可能更有效。像
这样的东西cv::Vec3f to_vec3f(cv::Mat1f const& m)
{
CV_Assert((m.rows == 3) && (m.cols == 1));
return cv::Vec3f(m.at<float>(0), m.at<float>(1), m.at<float>(2));
}
答案 1 :(得分:0)
一个简单的方法
Mat m = Mat::zeros(3,1,CV_32F);
Vec3f xyz((float*)m.data);
cout<<xyz<< endl;