将cv :: Mat转换为std :: vector 并发症[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将cv :: Mat转换为std :: vector 并发症[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我必须处理一个.PNG文件。处理采用std :: vector作为输入,我想将图像显示为灰度。所以我做了什么:

Mat img = imread("Image.PNG");
cvtColor(img, img, COLOR_RGB2GRAY);
imshow(windowName,img); 

这个图像看起来很好,cout<<img<<endl;吐出0到255之间的实际值。然后我想将这个cv :: Mat转换为std :: vector

std::vector<double> imgvec;
imgvec.assign(img.begin<double>(), img.end<double>());

现在这些值都非常小(大约1e-180)。为什么会发生这种情况,我该如何解决?

更新:

我按照@ Swift-Friday Pie的建议尝试了以下内容:

std::vector<double> imgvec;
if (img.isContinuous()){
    imgvec.assign((double*)img.datastart, (double*)img.dataend);
}else{
    for (int i = 0; i < img.rows; i++){
        imgvec.insert(imgvec.end(), img.ptr<double>(i) + img.cols);
    }
}

但是,这给了我以下错误:

no matching function for call to 'std::vector<double>::insert(std::vector<double>::iterator, double*)'
答案

您还没有将正确的参数传递给插入函数,它需要三个参数。所以更新的代码将是,

 std::vector<double> imgvec;
if (palette.isContinuous()) {
    imgvec.assign(palette.datastart, palette.dataend);  // No need to typecast to double * 
}
else {
    for (int i = 0; i < palette.rows; i++) {
        imgvec.insert(imgvec.end(), palette.ptr<double>(i),palette.ptr<double>(i) + palette.cols);
    }
}

您的代码中的错误是关于类型转换加倍*

另一答案

我会那样做,你能试一试吗?

#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>


template <typename T, typename ... Ts>
void insert_all(std::vector<T> &vec, Ts ... ts)
{
   (vec.push_back(ts), ...);
}

int main ()
{
 cv::Mat img = cv::imread("Image.PNG");
 cv::cvtColor(img, img, cv::COLOR_RGB2GRAY);
 std::vector<cv::Mat> imgvec;
 imgvec.reserve(1);
 insert_all(imgvec, img);
} 

g++ -std=c++17 test.cpp -o test `pkg-config --cflags --libs opencv`

以上是关于将cv :: Mat转换为std :: vector 并发症[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 std::string 转换回使用 std::stringstream << cv::Mat 生成的 cv::Mat

使用 OpenCV 在 C++ 中将 std::list 转换为 cv::Mat

如何在不复制数据的情况下将 cv::Mat 转换为 2d std::vector

std::vector<cv::Vec3b> 到 cv::Mat

cv::Mat_ 到 std::vector 的转换

向量的 OpenCV 向量到 cv::Mat