问题复现
#include <opencv2/opencv.hpp>
#include <thread>
void myFunction(cv::OutputArray output)
{
output.create(1200, 32, CV_8U);
}
int main()
{
cv::Mat outputImage;
std::thread threadLeft(myFunction, (outputImage));
threadLeft.join();
cv::imshow("Output", outputImage);
cv::waitKey(0);
return 0;
}
出现:
terminate called after throwing an instance of 'cv::Exception'
what(): OpenCV(4.2.0) ../modules/core/src/matrix_wrap.cpp:1236: error: (-215:Assertion failed) !fixedSize() || ((Mat*)obj)->size.operator()() == Size(_cols, _rows) in function 'create'
原因参考:
问题分析
OutputArray
的构造方式如下:
_outputarray(mat& m);
原代码std::thread threadLeft(myFunction, (outputImage));
中,thread
接收outputImage
,创建一个临时拷贝变量,再将该临时变量传递给myFunction
,当thread
运行时,myFunction
中的output
指向已经销毁的临时变量。
如何解决:
在创建thread
的时候,将原始参数通过_outputarray传递:
std::thread threadLeft(myFunction, cv::OutputArray(outputImage));