我班级的构造函数如下:
Foo::Foo(const cv::Mat &img){
_img = img.clone();
}
我本质上是尝试在80个不同的图像上运行80个模板并尝试运行omp并行for循环,这在大多数情况下都能正常工作。
int imgNum = 80;
std::vector<cv::Mat> imgStack(imgNum);
setImgStack(imgStack);
#pragma omp parallel for
for(int i = 0; i < imgNum; i++)
shared_ptr<Foo> test(new Foo(imgStack[i]));
然而,在5%左右,我随机获得.clone()行上抛出的未处理异常。
test_TemplateMatching.exe中0x00007FFCE4BA982C(opencv_world300.dll)的未处理异常:0xC0000005:访问冲突读取位置0x0000000000000008。
指向此处(在mat.inl.hpp上):
inline
Mat Mat::clone() const
{
Mat m;
copyTo(m);
return m;
}
我想强调的是,当发生这种情况时,它是不可预测的。我可以在成千上万的图像上运行它并记录它失败的地方。再次运行它,我得到不同的失败位置。如果我删除omp也不会发生这种情况,但是在我正在使用的数据集上,将时间加倍到非常不合理的数量。
在使用我不知道的omp时,是否存在克隆图像的某种问题?