【问题标题】:convert unsigned short mat to vector in opencv在opencv中将无符号短垫转换为向量
【发布时间】:2015-08-22 18:15:44
【问题描述】:

我在opencv中加载深度图像

cv::Mat depth = cv::imread("blabla.png",CV_LOAD_IMAGE_UNCHANGED);

然后获取它的子图像

cv::Mat sub_image= depth(cv::Rect( roi_x,roi_y,roi_size,roi_size)).clone();

现在我想将该 sub_image 转换为矢量

我试试

std::vector<uchar> array;
array.assign(sub_image.datastart,sub_image.dataend);

在 StackOverflow 中找到了一个类似的问题,但它似乎无法正常工作。

赋值后数组的大小不是roi_size * roi_size, 而是 roi_size*roi_size*2

向量的类型有问题吗?我还尝试了其他各种类型,例如 double、float、int 等

深度图的类型是unsigned short吧??

编辑:

当我标准化深度图像时,数组正确填充(正确的大小 roi_size*roi_size)

cv::Mat depthView;
cv::normalize(depth, depthView, 0, 255, cv::NORM_MINMAX,CV_8UC1);

但这不是我想做的事

【问题讨论】:

  • 已经试过了,没用

标签: c++ opencv vector mat


【解决方案1】:

您对roi_size*roi_size*2 的观察是因为深度图像是short 类型,每个大小都是2 bytes。您正在尝试将此图像数据推送到 unsigned char 类型的数组。

将向量类型设为short,您会发现数组大小按预期恢复为roi_size*roi_size。这些值也将是您所期望的。

【讨论】:

    【解决方案2】:

    您是否尝试过检查您阅读的是哪种类型的图像,即使用 depth.type() == CV_8UC1 表示 1 通道的 8 位 uchar。

    也许您的图像被不同地解释了。 您是否尝试过使用标志 CV_LOAD_IMAGE_GRAYSCALE 而不是 CV_LOAD_IMAGE_UNCHANGED 读取图像?

    【讨论】:

    • std::coutninghang.blogspot.gr/2012/11/list-of-mat-type-in-opencv.html 我的深度图像是 CV_16U,带有 1 个通道,使用 CV_LOAD_IMAGE_GRAYSCALE 加载它使其类型为 0 并与其值网格化
    • 官方枚举可以找到here
    • 所以根据它会是ushort?
    • 是的,没错,但是将数组设为 ushort std::vector 数组;无论出于何种原因都无济于事......
    • 由于sizeof(unsinged char) = 1sizeof(unsinged short) = 2,我还建议尝试std::vector&lt;unsinged short&gt;,正如@GPPK 所写。或者,如果您需要将 cv::Mat 或图像转换为 unsigned char.
    【解决方案3】:

    感谢大家的帮助, 我想我设法解决了这个问题。

    我把数组赋值的代码改成了这个

    std::vector<unsigned short> array(sub_image.begin<unsigned short>(),sub_image.end<unsigned short>());
    

    现在大小是正确的 roi_size*roi_size

    再次感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2013-09-02
      • 2016-02-17
      • 1970-01-01
      相关资源
      最近更新 更多