C++ 在线程中运行OutputArray::create()时,断言失败 #包括 #包括 #包括 使用名称空间std; 使用名称空间cv; void testThread(输出阵列映像){ 创建图像(100,32,CV_8U); } //无效测试线程(Mat图像){ //创建图像(100,32,CV_8U); // } //无效测试线程(Mat和图像){ //创建图像(100,32,CV_8U); // } int main(int argc,字符**argv){ Mat left=imread(“./left.png”,CV_8U); Mat right=imread(“./right.png”,CV_8U); 线程t1(测试线程,左侧); 线程t2(测试线程,右侧); t1.join(); t2.连接(); //测试线程(左); //testThread(右); 返回0; }

C++ 在线程中运行OutputArray::create()时,断言失败 #包括 #包括 #包括 使用名称空间std; 使用名称空间cv; void testThread(输出阵列映像){ 创建图像(100,32,CV_8U); } //无效测试线程(Mat图像){ //创建图像(100,32,CV_8U); // } //无效测试线程(Mat和图像){ //创建图像(100,32,CV_8U); // } int main(int argc,字符**argv){ Mat left=imread(“./left.png”,CV_8U); Mat right=imread(“./right.png”,CV_8U); 线程t1(测试线程,左侧); 线程t2(测试线程,右侧); t1.join(); t2.连接(); //测试线程(左); //testThread(右); 返回0; },c++,multithreading,opencv,opencv3.0,C++,Multithreading,Opencv,Opencv3.0,为什么它串行执行正常而并行抛出异常? 此外,如果您将testThread的原型更改为第二个原型,它在parllel中也会正常执行,但在第三个原型中会失败。 打印到控制台的异常信息如下所示: OpenCV(3.4.1)错误:在create,file/home/linjiaqin/software/OpenCV-3.4.1/modules/core/src/matrix_wrap.cpp,第1240行,断言失败(!fixedSize()| |((Mat*)obj)->size.operator()=

为什么它串行执行正常而并行抛出异常? 此外,如果您将testThread的原型更改为第二个原型,它在parllel中也会正常执行,但在第三个原型中会失败。 打印到控制台的异常信息如下所示:

OpenCV(3.4.1)错误:在create,file/home/linjiaqin/software/OpenCV-3.4.1/modules/core/src/matrix_wrap.cpp,第1240行,断言失败(!fixedSize()| |((Mat*)obj)->size.operator()==size(_cols,_rows))
在引发“cv::Exception”的实例后调用terminate
what():OpenCV(3.4.1)/home/linjiaqin/software/OpenCV-3.4.1/modules/core/src/matrix_wrap.cpp:1240:错误:(-215)!函数create中的fixedSize()| |((Mat*)obj)->size.operator()()==size(_cols,_rows)

您有悬空引用

OutputArray
具有通过引用获取
Mat
的构造函数:

_OutputArray(Mat& m);
创建线程时,将
作为
Mat
实例传递到左侧。因为线程体的签名采用
OutputArray
,它可以将
Mat
这个
Mat
作为参数创建为副本。然后,
OutputArray
通过引用获取这个临时对象。当
thread
开始执行时,
OutputArray
引用已销毁的temp
Mat
实例(
thread
只需要存储
OutputArray
,没有临时
Mat

解决方案?只需将原始的
传递到
输出阵列

thread t1(testThread, OutputArray(left));
t1.join();

在上面的代码中,没有创建
Mat
的临时实例作为
left
的副本。

对不起,我忘了取消对“Mat right”的注释,我只想测试一个线程。我不明白。那么它只能连载吗?谢谢,我已经知道了!那你为什么问这个问题?我向你解释了你的错误在哪里。悬挂引用会产生未定义的行为。