将 3D 向量分配给 4d 向量或如何使用 OpenCV<double, 4> 将 cv::Vec<double, 3> 转换为 cv::Vec

问题描述 投票:0回答:1

是否有更好或更有效的方法将

cv::Vec<double, 4>
转换为
cv::Vec<double, 3>
。 该示例显示了我当前使用
reinterpret_cast
的解决方案。我想指出的是,向量 c 指向与向量 a 相同的数据,但作为
cv::Vec<double,3>

cv::Vec<double, 4> a(1,2,3,4);
cv::Vec<double, 3> b(5,6,7);
std::cout << "a: " << a << ", b: " << b << std::endl;
cv::Vec<double, 3> &c = reinterpret_cast<cv::Vec<double, 3>&>(a);
c = b;
std::cout << "a: " << a << ", b: " << b << std::endl;

输出:

a: [1, 2, 3, 4], b: [5, 6, 7]
a: [5, 6, 7, 4], b: [5, 6, 7]
c++ opencv vector casting reinterpret-cast
1个回答
2
投票
cv::Vec<double, 3> &c = reinterpret_cast<cv::Vec<double, 3>&>(a);

使用

c
将是未定义的行为。
c
Vec<double, 3>
类型的 lvlaue,它引用
Vec<double, 4>
类型的对象。按照 [basic.lval] p11 使用它是 UB。另请参阅什么是严格别名规则以及我们为何关心?

这两种类型“大致相似”并且它们都存储某种大小的

double[]
并不重要,尽管这种相似性使其在您的机器上“工作”。

正确的方法是创建一个新的

cv::Vec<double, 3>

cv::Vec<double, 4> a(1,2,3,4);
cv::Vec<double, 3> c(a.val);

这使用了 cv::Vec

 构造函数,它接受 
const double*

© www.soinside.com 2019 - 2024. All rights reserved.