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