作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想优雅地将 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/
我是一名优秀的程序员,十分优秀!