如何将C++数组转换为opencv Mat
How to convert C++ array to opencv Mat
将C++数组转换为2D opencv Mat对象的最快方法是什么? 蛮力方法是遍历 2D mat 的所有条目,并用数组的值填充它们。
有没有更好/更快的方法来做到这一点? 我可以以某种方式将数组的指针指向 2D 矩阵吗?
(我正在使用opencv 2.4.8)
是的,在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– 指向用户数据的指针。采用数据和步骤参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化指向指定数据的矩阵标头,这意味着不会复制任何数据。此操作非常有效,可用于使用 OpenCV 函数处理外部数据。外部数据不会自动解除分配,因此您应该处理它。
它会很快工作,但它是同一个数组,如果你在cv::Mat
之外修改它,它会在cv::Mat
中被修改,如果它在任何时候被销毁,cv::Mat
的data
成员将指向一个不存在的地方。
更新:
我也忘了说,你可以创建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));
#include <opencv2/opencv.hpp>
int main()
{
// First row contains 3 white pixels
// Second row contains 3 black pixels
uchar temp[2][3] = {{255, 255, 255}, {0, 0, 0}};
cv::Mat mat = cv::Mat(2, 3, CV_8UC1);
// The first element of temp decays to int* data.
// It means that mat.data tracks temp.
mat.data = temp[0];
// Change the upper left pixel to black from temp,
// the change affects mat.
temp[0][0] = uchar(0);
cv::namedWindow("title", cv::WINDOW_NORMAL);
cv::imshow("title", mat);
cv::waitKey();
return 0;
}
相关文章:
- C++中的openCV Mat访问冲突
- 如何通过引用传递OpenCV MAT
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- 将 OpenCv Mat 从 C++ 传递给 Python
- 将帧从 h264 流解码到 OpenCV Mat
- 如果函数使用 OPENCV Mat 作为输入,如何编写头文件?
- 无法从Java读取C++中保存的Opencv Mat映像
- 如何通过套接字发送OpenCV Mat
- 如何有效地在OpenCV Mat和GpuMat上进行元素处理?
- 什么是使用 opencv::Mat 优化 c++ 矩阵计算
- openCV Mat 中的值在自定义类构造函数中设置后不会保留
- OpenCV Mat 的逗号分隔初始值设定项是如何用C++实现的?
- Libav AVFrame to Opencv Mat to AVPacket conversion
- 采用OpenCV Mat<doube>并转换为12位值数组。
- 如何将C++数组转换为opencv Mat
- 通过QT WebSocket将OpenCV Mat Image发送到HTML客户端
- OpenCV Mat::row assignment
- 如何在 OpenCV Mat 中保留固定的缓冲区大小
- OPENCV MAT问题:直方图和此循环之间的差异