【发布时间】:2017-03-09 03:06:59
【问题描述】:
我想直接使用 OpenCVs 矩阵函数对向量对象进行操作。
我目前正在做的是使用 memcpy 将数据复制到矩阵中,但我真的很想直接对其进行操作,因为我非常关心性能。以下是我当前按预期工作的实现。
工作实施
void TrajectorySmoother::SmoothTrajectoryOnce(
std::vector<navstack_msgs::location>& path,
const unsigned int& end_remove)
{
cv::Mat_<double> matrix_orig = cv::Mat(path.size(), sizeof(navstack_msgs::location)/sizeof(double), CV_64F);
memcpy(matrix_orig.data, path.data(), path.size()*sizeof(navstack_msgs::location));
ROS_INFO_STREAM("mat: " << matrix_orig);
}
我尝试使用 static_cast 和 reinterpret_cast,但它们似乎不起作用,所以我尝试将指向数据的指针作为指向 openCV 矩阵的指针。
指针转换方法
void TrajectorySmoother::SmoothTrajectoryOnce(
std::vector<navstack_msgs::location>& path,
const unsigned int& end_remove)
{
cv::Mat_<double> matrix_orig = cv::Mat(path.size(), sizeof(navstack_msgs::location)/sizeof(double), CV_64F);
cv::Mat_<double> * matrix_ptr = reinterpret_cast<cv::Mat_<double> *>(path&);
ROS_INFO_STREAM("mat: " << (*matrix_ptr));
}
它的输出是一个分号流。我认为它可能需要重新整形,但我得到一个错误,它不连续。
【问题讨论】:
-
它们不是都是连续的数据类型吗?我认为既然 memcpy 有效,那么我应该能够随心所欲地转换数据。我的逻辑有问题吗?
-
想一想,
vector通常只是指向分配给vector的数据的几个指针,所以你已经将一个指向数据而不是数据的指针转换为你的mat。克罗姆只知道你穿过了谁的记忆。 -
我知道内存区域的大小,因为我是counting on the vector to be contiguous。我想我应该可以施放它。
-
vector数据是连续的。不幸的是,vector数据在这里……而vector本身就在那里。无论如何,你违反了Strict Aliasing Rule。阅读关于类型别名的部分。
标签: c++ opencv pointers vector casting