我可以将矢量投入到OpenCV矩阵中吗?

Can I cast a vector into an OpenCv matrix?

本文关键字:OpenCV 我可以      更新时间:2023-10-16

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

输出的是半分析流。我认为它可能需要重塑,但是我会发现它不是连续的。

您没有发布navstack_msgs::location的定义,因此很难说您的要求是否有意义。

OpenCV为"借用"(即非拥有)内存提供了cv::Mat构造函数(4)的构造函数:

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#a51615ebf17a64c968df0bf0bf49bf49b49b49b4de6a3a

由于OpenCV矩阵是行 - 莫约尔,因此您可以这样使用它来创建Mat"视图":

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