将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