gpt4 book ai didi

c++ - 如何将 cv::Mat 转换为 cv::Vec3f?

转载 作者:行者123 更新时间:2023-11-27 22:41:56 33 4
gpt4 key购买 nike

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

有更好的方法吗?

最佳答案

在您的评论中,您指定这是一个大小为 3x1 的单 channel 浮点矩阵。我会在代码中明确说明数据类型,所以我会用 cv::Mat1f 表示它.

现在,因为它是一个单 channel 矩阵,我们不能直接访问 Vec3f 元素,因为如果输入 Mat 是一个子矩阵,我们会得到不正确的结果.我们可以使用 cv::Mat::reshape有效地将输入转换为 3 channel 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));
}

关于c++ - 如何将 cv::Mat 转换为 cv::Vec3f?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48243196/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com