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

标签 c++ arrays opencv vector synthesis

我是 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/

相关文章:

c++ - Armadillo C++ LU 分解

c++ - 计算CRC的C程序

javascript - 检查数组键是否为数字

visual-c++ - 在 VC++ 中使用 openCV 的 IP 摄像机视频流

python - 如何在Canny边缘检测输出周围添加边界框?

c++ - C++ 筛选代码中的不可见内存错误

c++ - 使用 map 检查 id 是否存在

java - 一步在HashMap中声明和放置String数组

c++ - 将特定数组元素的地址传递给函数

python - OpenCV VideoCapture 表示视频有 0 帧(C++ 和 Python)