OpenCV 3D Mat 到 Vector

2024-01-07

我有 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)

要获取包含相同元素的相同类型的向量:

  1. 使用重载的 STL 向量构造函数:

    声明并初始化与矩阵相同类型的向量并复制所有 mat 元素:

    const int* p3 = m3.ptr<int>(0);
    std::vector<int> flat0(p3, p3+m3.total());
    
  2. 使用 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(使用前将#替换为@)

OpenCV 3D Mat 到 Vector 的相关文章

  • 如何提取图像中的表格

    我想从图像中提取表格 这个 python 模块https pypi org project ExtractTable https pypi org project ExtractTable 与他们的网站https www extractta
  • 3D 数学:根据“向上”和“向上”正交向量计算倾斜(滚动)角度

    我希望这是提出这个问题的正确位置和这个一样 https stackoverflow com questions 3035590 bank angle from up vector and look at vector 但表示为纯数学而不是图
  • 编译使用Basler相机的程序

    我正在尝试使用 Basler 相机捕获图像的 C 程序来工作 我拿到 来自制造商的代码 它应该 非常容易使用 但是 链接它有 成为一场噩梦 我的 C 时代已经过去了 最近只使用 Matlab 所以我可能会犯一些愚蠢的错误 但请赐教 代码如下
  • Three.js 设置并读取相机外观向量

    而不是使用camera rotation或lookAt 函数旋转相机 我想将外观矢量直接传递给相机 是否可以直接设置相机外观矢量以及是否可以从相机读取外观矢量 相机没有 外观矢量 因此无法设置它 但是 您可以构造一个point通过将您的外观
  • 如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

    我有两个人脸 3D 网格 我希望使用热图来说明差异 我想使用红蓝发散色阶 我的数据可以查到here https github com Patricklv How to create heatmap illustraing 3D mesh d
  • brew 链接 jpeg 问题

    我正在尝试安装opencv在 Mac OSX Lion 上 brew install opencv 我收到以下错误 以及其他一些类似的错误 Error The linking step did not complete successful
  • opencv createsamples没有错误,但是没有找到样本

    我在用着this http coding robin de 2013 07 22 train your own opencv haar classifier html教程 我正在根据我的正面图像创建大量样本 我正在使用 Windows 这是
  • 一个同时接受 std::vector 和 QVector 的函数模板?

    假设我有一个函数叫做loadData 它需要一个容器 填充数据 和一个 CSV 文件 我需要以下重载 loadData std vector
  • 使用比较器对向量进行排序,比较器会动态改变其行为

    我有一个自定义结构体的向量和一个属性列表 用于按优先级降序对该向量进行排序 例如 struct TheStruct artist String title String date String let order vec Vec
  • 添加到 std::vector 的中间

    有没有办法将值添加到 a 的中间vector在 C 中 假设我有 vector
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 从设备坐标系到绝对坐标系的加速度

    从我的 Android 设备中 我可以读取线性加速度值数组 在设备的坐标系中 和绝对方向值数组 在地球坐标系中 我需要的是获得后一个坐标中的线性加速度值 系统 我怎样才能转换它们 EDIT阿里在评论中回复后 好吧 如果我理解正确的话 当我测
  • 使用步骤 c++ 构建向量

    是否可以在不使用 C 中的循环的情况下以固定步骤创建从一个值到另一个值的向量 例如 我想用步长 0 5 构建一个从 1 到 10 的向量 在 MATLAB 中我可以按如下方式执行此操作 vector 1 0 5 10 c 中有类似的东西吗
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • 从向量中删除向量::end

    当我使用时它工作正常吗 什么也不做 vector
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • C# 等价于 C++ 向量或双端队列

    我几乎可以肯定这应该是重复的 但我搜索了一段时间但找不到答案 我应该在 C 中使用什么来替换 C 向量和双端队列有效率的 也就是说 我需要一种有效支持直接索引的结构 并且还支持以有效的方式再次从一端或两端删除 取决于向量或双端队列的情况 在
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an

随机推荐