gpt4 book ai didi

c++ - 如何将 C++ 数组转换为 opencv Mat

转载 作者:可可西里 更新时间:2023-11-01 18:15:42 26 4
gpt4 key购买 nike

将 C++ 数组转换为 2D opencv Mat 对象的最快方法是什么?蛮力方法是遍历 2D 垫的所有条目并用数组的值填充它们。
有更好/更快的方法吗?我能以某种方式将数组的指针指向二维矩阵吗?
(我使用的是 opencv 2.4.8)

最佳答案

是的,在 documentation 中的 cv::Mat您可以看到它是如何实现的。

具体在这一行

C++: Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)

这意味着你可以做类似的事情

double x[100][100];

cv::Mat A(100, 100, CV_64F, x);

这不会将数据复制到它。您还必须记住,OpenCV 数据是行优先的,这意味着它具有一行的所有列,然后是下一行,依此类推。所以你的阵列必须匹配这种风格才能工作。

关于它有多快,文档中也有讲到:

data – Pointer to the user data. Matrix constructors that take data and step parameters do not allocate matrix data. Instead, they just initialize the matrix header that points to the specified data, which means that no data is copied. This operation is very efficient and can be used to process external data using OpenCV functions. The external data is not automatically deallocated, so you should take care of it.

它会工作得相当快,但它是同一个数组,如果你在 cv::Mat 之外修改它, 它将在 cv::Mat 中修改,如果它在任何时候被销毁,data cv::Mat的成员将指向一个不存在的地方。

更新:

我忘了说,你可以创建 cv::Mat并做 std::memcpy .这样它将复制数据,这可能会更慢,但数据将归 cv::Mat 所有。对象并用 cv::Mat 销毁驱逐舰。

double x[100][100];
cv::Mat A(100,100,CV_64F);
std::memcpy(A.data, x, 100*100*sizeof(double));

关于c++ - 如何将 C++ 数组转换为 opencv Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44453088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com