如何获得访问矢量垫对象在OpenCV
How to get access to vector mat object in OpenCV
我想从文件加载一些图片到Mat-objects (OpenCV),并希望将它们存储在矢量中。进一步的OpenCV调用/对象需要向量(如:AlignMTB)作为参数。但是在用mat对象填充向量之后,我只能访问我添加到向量中的最后一个元素。
在示例中,我首先将图像加载到中间Mat-object并将其转换为CV_32FC3。然后打印出一个样本像素的bgr值。打印结果为:
File 0: 13 13 157
File 1: 17 20 159
File 2: 8 8 152
然后我将这个中间的Mat添加到Mat-vector图像中。
之后,我试图打印出第一张和第二张图像的样本像素值,但我总是得到第三张图像的值:
File 0: 8 8 152
File 1: 8 8 152
我在访问矢量数据时犯了什么错误?
我试着用这个例程:
vector<Mat> images;
images.reserve(3);
Mat img;
for (int i = 0; i < 3; i++)
{
imread("F:/Test/file" + to_string(i) + ".jpg").convertTo(img, CV_32FC3);
cout << "File " << i << ": " << img.at<Vec3f>(800, 800)[0] << " " << img.at<Vec3f>(800, 800)[1] << " " << img.at<Vec3f>(800, 800)[2] << endl;
images.push_back(img);
}
cout << endl;
cout << "File " << 0 << ": " << images[0].at<Vec3f>(800, 800)[0] << " " << images[0].at<Vec3f>(800, 800)[1] << " " << images[0].at<Vec3f>(800, 800)[2] << endl;
cout << "File " << 1 << ": " << images[1].at<Vec3f>(800, 800)[0] << " " << images[1].at<Vec3f>(800, 800)[1] << " " << images[1].at<Vec3f>(800, 800)[2] << endl;
问题不是vector::push_back
,因为它将构造给定元素的副本。然而,问题是Mat
的复制构造函数没有复制相关的数据:
这些构造函数不复制数据。相反,将构造指向m数据或其子数组的头文件并与之关联。
你可以做什么来解决这个问题是一个显式的Mat::clone
操作,它也复制数据或移动矩阵声明在for循环。
vector<Mat> images;
images.reserve(3);
Mat img;
for (int i = 0; i < 3; i++)
{
imread("F:/Test/file" + to_string(i) + ".jpg").convertTo(img, CV_32FC3);
cout << "File " << i << ": " << img.at<Vec3f>(800, 800)[0] << " " << img.at<Vec3f>(800, 800)[1] << " " << img.at<Vec3f>(800, 800)[2] << endl;
images.push_back(img.clone());
}
cout << endl;
cout << "File " << 0 << ": " << images[0].at<Vec3f>(800, 800)[0] << " " << images[0].at<Vec3f>(800, 800)[1] << " " << images[0].at<Vec3f>(800, 800)[2] << endl;
cout << "File " << 1 << ": " << images[1].at<Vec3f>(800, 800)[0] << " " << images[1].at<Vec3f>(800, 800)[1] << " " << images[1].at<Vec3f>(800, 800)[2] << endl;
相关文章:
- Tensorflow对象检测在Python和C++(OpenCV)之间有不同的结果
- openCV C++将对象/斑点简化为质心
- Opencv,在图像中的对象周围绘制一个框
- OpenCV Otsu的阈值:计算多个Mat对象的单个阈值
- 将 OpenCV 帧另存为对象
- 如何将图像缓冲区传递到OpenCV垫子对象
- 与 Python 共享 OpenCV C++ 对象
- OPENCV SVM-对象不属于任何受过训练的类
- 如何使用OpenCV从图像中检测旋转对象
- C++中的对象序列化,用于存储 OpenCV 的 SVM 对象 [OpenCV 3.1.0]
- OpenCV 检测多个旋转的缩放对象
- 将一个 OpenCV OutputArrayOfArrays 对象复制到另一个对象
- OPENCV从Yuyv Pixelformat视频框架创建YUV420或灰度垫子对象
- OpenCV程序的输出在未检测到文本对象时不给出0
- OPENCV(C ) - 从已知的3D对象和相机位置计算图像的2D坐标
- 将数组分配给OPENCV C 中的初始化垫子对象
- OpenCV Mat对象复制速度更快
- OpenCV-C++中Mat对象的平均值
- 计算检测到的对象OPENCV
- 垫子对象 OpenCv 上的数学运算