是否有更好或更有效的方法将
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]
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*
。