【发布时间】:2018-05-23 10:34:01
【问题描述】:
我必须处理一个 .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*)'
【问题讨论】:
-
如果需要
unsigned char,为什么要使用double? -
@zindarod 因为处理部分是一个以
std::vector<double>为输入的外部库 -
您更新中的第一个
if分支肯定是不正确的。img不以双精度格式存储数据,因此将数据字节当作双精度来读取会产生垃圾。我怀疑这与img.begin<double>()存在相同的问题,但我对 OpenCV 迭代器的了解不足以肯定地说。同样的错误发生在第二个分支中,除了你试图将指向数据的指针写入向量(而不是它指向的数据)。