我可以将矢量转换为OpenCv矩阵吗?

时间:2017-03-09 03:07:00

标签: c++ opencv pointers vector casting

我想直接使用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_castreinterpret_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));
}

这是一个分号流。我认为它可能需要重新塑造,但我得到一个错误,它不是连续的。

1 个答案:

答案 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查看它。