将cv :: Mat转换为std :: vector <double>并发症

时间:2018-05-23 10:34:02

标签: c++ opencv

我必须处理一个.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*)'

2 个答案:

答案 0 :(得分:1)

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

 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);
    }
}

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

答案 1 :(得分:1)

我会这样做,你能尝试一下吗?

#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`