Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cv::Mat的std::vector_C++_Opencv_Vector - Fatal编程技术网

C++ cv::Mat的std::vector

C++ cv::Mat的std::vector,c++,opencv,vector,C++,Opencv,Vector,继续我的计算机视觉的东西,我得到了一个点,我计算描述符的一个补丁在N个摄像头。 问题是,当我计算描述符时,OpenCV中的函数是 descriptor.compute(image, vecKeypoints, matDescriptors); 其中,vecKeypoints是cv::KeyPoints的向量,matdescriptor是一个cv::Mat,根据OpenCV的文档,它会被计算出的描述符填充 因为我有N个摄像头,所以我计算了每个摄像头的几个描述符,所以我为N个摄像头中的每个摄像头存

继续我的计算机视觉的东西,我得到了一个点,我计算描述符的一个补丁在N个摄像头。 问题是,当我计算描述符时,OpenCV中的函数是

descriptor.compute(image, vecKeypoints, matDescriptors);
其中,vecKeypoints
cv::KeyPoints
的向量,matdescriptor是一个
cv::Mat
,根据OpenCV的文档,它会被计算出的描述符填充

因为我有N个摄像头,所以我计算了每个摄像头的几个描述符,所以我为N个摄像头中的每个摄像头存储了K个描述符。因此,我创建了一个描述符向量(即矩阵)


Mat是像素的某种智能指针,因此Mat a=b将为a和b共享像素。push_back()的类似情况


如果需要“深度复制”,请使用Mat::clone()

Mat是像素的某种智能指针,因此Mat a=b将为a和b共享像素。push_back()的类似情况


如果需要“深度复制”,请在每个循环中使用Mat::clone()

,确保在附加到向量之前调用函数cv::Mat::release()。

在每个循环中,确保在附加到向量之前调用函数cv::Mat::release(),因此,无论何时使用赋值运算符或复制构造函数(push_在代码中使用)复制它,数据都不会被复制,而是与新对象共享。其中一个数据的任何更改都将反映在另一个数据中。事实上,正如您所观察到的,指针是相同的

在这种情况下,您只需要为每次迭代创建一个新的cv::Mat:

for (...) {
    cv::Mat d;
    descriptor.compute(..., d);
    camsDescriptors.push_back(d);
}
我在寻找的答案是,如果你想预先分配矩阵,这里有一种方法可以做到这一点,而无需拷贝、临时或意外共享:

std::vector v;
v.reserve(N);
for (size_t i = 0; i < N; i++) {
    // Uninitialized Mat of specified size, header constructed in place
    v.emplace_back(height, width, CV_8UC1);
}

std::vector v;
v、 储备(N);
cv::垫温度(高度、宽度、cv_8UC1);
对于(大小i=0;i

在这两种情况下,数据将在向量的所有元素之间在幕后共享,这根本不是我们创建向量时想要的

cv::Mat隐式共享数据,因此,无论何时使用赋值运算符或复制构造函数(push_在代码中使用)复制数据,数据都不会被复制,而是与新对象共享。其中一个数据的任何更改都将反映在另一个数据中。事实上,正如您所观察到的,指针是相同的

在这种情况下,您只需要为每次迭代创建一个新的cv::Mat:

for (...) {
    cv::Mat d;
    descriptor.compute(..., d);
    camsDescriptors.push_back(d);
}
我在寻找的答案是,如果你想预先分配矩阵,这里有一种方法可以做到这一点,而无需拷贝、临时或意外共享:

std::vector v;
v.reserve(N);
for (size_t i = 0; i < N; i++) {
    // Uninitialized Mat of specified size, header constructed in place
    v.emplace_back(height, width, CV_8UC1);
}

std::vector v;
v、 储备(N);
cv::垫温度(高度、宽度、cv_8UC1);
对于(大小i=0;i
在这两种情况下,数据将在向量的所有元素之间在幕后共享,这根本不是我们创建向量时想要的

std::vector v;
v.resize(N, cv::Mat(height, width, CV_8UC1));
std::vector v;
v.reserve(N);
cv::Mat temp(height, width, CV_8UC1);
for (size_t i = 0; i < N; i++) {
    // Uninitialized Mat of specified size, header copied from temp
    v.push_back(temp);
}