我有 3D Mat,想将其转换为 Vector。我尝试了 opencv 的 reshape() 函数,但它似乎不适用于维度超过 2 的矩阵。如何将 3D Mat 转换为 Vector ?我可以通过访问 Mat 中的所有元素来做到这一点。有什么有效的办法吗?
如果我们有以下 3D 矩阵:
const int ROWS=2, COLS=3, PLANES=4;
int dims[3] = {ROWS, COLS, PLANES};
cv::Mat m = cv::Mat(3, dims, CV_32SC1); // works with other types (e.g. float, double,...)
这只适用于连续垫对象(即 m.isContinously() == true)
要获取包含相同元素的相同类型的向量:
-
使用重载的 STL 向量构造函数:
声明并初始化与矩阵相同类型的向量并复制所有 mat 元素:
const int* p3 = m3.ptr<int>(0);
std::vector<int> flat0(p3, p3+m3.total());
-
使用 OpenCV 的重塑:
这与第一个解决方案的不同之处在于元素最终的布局方式。
最初来自这篇文章:如何使用opencv C++将3D矩阵分成一堆2D矩阵 https://stackoverflow.com/questions/19189475/how-to-divide-3d-matrix-into-bunches-of-2d-matrix-with-opencv-c我赞同他的建议,如果可能的话,将维度定义为渠道。 OpenCV 处理通道比处理维度更好。当然,如果您打算拥有超过 4 个维度,则这可能不适用。
cv::Mat m2(ROWS, COLS*PLANES, CV_32SC1, m3.data); // no copying happening here
cv::Mat m2xPlanes = m2.reshape(PLANES); // not sure if this involves a copy
std::vector<Mat> planes;
cv::split(m2xPlanes, planes); // usually used for splitting multi-channel matrices
std::vector<int> flat;
for(size_t i=0; i<planes.size(); i++) {
cv::Mat plane_i = planes[i];
const int* plane_i_ptr = plane_i.ptr<int>(0);
flat.insert(flat.end(), plane_i_ptr, plane_i_ptr+plane_i.total());
}
对于这两种解决方案,所有元素都被考虑在内,只是它们的顺序不同,因此访问方式也不同。
首先,您通过以下方式访问 row、col、plane 处的元素
int index = row * COLS * PLANES + col * PLANES + p
在第二个元素中,元素按平面排序。
选择哪种解决方案可能取决于您将如何索引向量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)