我想直接使用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));
}
这是一个分号流。我认为它可能需要重新塑造,但我得到一个错误,它不是连续的。
答案 0 :(得分:3)
您没有发布navstack_msgs::location
的定义,因此很难说您要求的内容是否合理。
OpenCV为&#34;借用&#34;提供了一堆cv::Mat
构造函数。 (即非拥有的)记忆:
Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)
Mat (Size size, int type, void *data, size_t step=AUTO_STEP)
Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0)
Mat (const std::vector< int > &sizes, int type, void *data, const size_t *steps=0)
http://docs.opencv.org/3.2.0/d3/d63/classcv_1_1Mat.html#a51615ebf17a64c968df0bf49b4de6a3a
由于OpenCV矩阵是行主要的,您可以像这样使用它来创建Mat
&#34;视图&#34;:
std::vector<T> path;
cv::Mat mat(path.size(), sizeof(T), CV_8U, path.data());
现在每行都有path
中的一个元素的数据。
但你必须假设将T
解释为uchar
s序列是有意义的。如果您认为T
是一堆double
s(例如POD:struct T { double x; double y; };
)。然后就可以了
cv::Mat mat(path.size(), sizeof(T) / 8, CV_64F, path.data());
但如果T
有其他内容或者它有指针(例如typedef std::vector<double> T
),那么您将无法通过cv::Mat
查看它。