将unsigned short mat转换为opencv中的vector

convert unsigned short mat to vector in opencv

本文关键字:opencv 中的 vector 转换 unsigned short mat      更新时间:2023-10-16

我在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);

但那不是我想做的

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

使向量类型为short,您将发现数组大小如预期的那样回到roi_size*roi_size

您是否尝试检查您读取的图像类型,即使用depth.type() == CV_8UC1用于8位uchar与1通道。

可能你的图像被不同的解释。你试过用CV_LOAD_IMAGE_GRAYSCALE而不是CV_LOAD_IMAGE_UNCHANGED来读取图像吗?

谢谢大家的帮助,我想我已经解决了这个问题。

我将数组赋值的代码更改为

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

,现在大小是正确的roi_size*roi_size

再次感谢您的帮助