gpt4 book ai didi

c++ - 在 OpenCV 中将 Mat 转换为数组/vector

转载 作者:IT老高 更新时间:2023-10-28 12:35:06 25 4
gpt4 key购买 nike

我是 OpenCV 的新手。最近,我很难找到从 Mat 转换为 Array 的 OpenCV 函数。我研究了 OpenCV API 中可用的 .ptr 和 .at 方法,但我无法获得正确的数据。我想直接从 Mat 转换为 Array(如果可用,如果不是 Vector)。我需要 OpenCV 函数,因为代码必须在 Vivado HLS 中进行高级合成。请帮忙。

最佳答案

如果Mat mat的内存是连续的(它的所有数据都是连续的),可以直接把它的数据拿到一维数组中:

std::vector<uchar> array(mat.rows*mat.cols*mat.channels());
if (mat.isContinuous())
array = mat.data;

否则,您必须逐行获取其数据,例如到二维数组:

uchar **array = new uchar*[mat.rows];
for (int i=0; i<mat.rows; ++i)
array[i] = new uchar[mat.cols*mat.channels()];

for (int i=0; i<mat.rows; ++i)
array[i] = mat.ptr<uchar>(i);

更新:如果你使用 std::vector 会更容易,你可以这样做:

std::vector<uchar> array;
if (mat.isContinuous()) {
// array.assign(mat.datastart, mat.dataend); // <- has problems for sub-matrix like mat = big_mat.row(i)
array.assign(mat.data, mat.data + mat.total()*mat.channels());
} else {
for (int i = 0; i < mat.rows; ++i) {
array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i)+mat.cols*mat.channels());
}
}

p.s.:对于其他类型的cv::Mat,比如CV_32F,你应该这样做:

std::vector<float> array;
if (mat.isContinuous()) {
// array.assign((float*)mat.datastart, (float*)mat.dataend); // <- has problems for sub-matrix like mat = big_mat.row(i)
array.assign((float*)mat.data, (float*)mat.data + mat.total()*mat.channels());
} else {
for (int i = 0; i < mat.rows; ++i) {
array.insert(array.end(), mat.ptr<float>(i), mat.ptr<float>(i)+mat.cols*mat.channels());
}
}

UPDATE2:对于OpenCV Mat数据的连续性,可以总结如下:

  • imread()clone() 或构造函数创建的矩阵将始终是连续的。
  • 矩阵不连续的唯一情况是它从现有矩阵(即根据大垫子的投资返回率创建)。

请查看this code snippet进行演示。

关于c++ - 在 OpenCV 中将 Mat 转换为数组/vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26681713/

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