如何将cv :: Mat转换为cv :: Vec3f?

时间:2018-01-13 18:50:17

标签: c++ opencv

我想优雅地转换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);

有更好的方法吗?

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;