我写了一个小程序来对使用cv::Mat
与cv::UMat
的算法进行基准测试。
代码运行无错误,直到main
结束并在UMat::release
中引发断言错误而崩溃:
OpenCV(3.4.3)错误:在cv :: StdMatAllocator :: deallocate中断言失败(u-> refcount == 0),文件c:\ develop \ 3rdparty \ opencv-3.4.3 \ modules \ core \ src \ matrix.cpp,第169行
在调试和发布模式下均会发生错误(我在Visual Studio 2017上进行构建)。 我将代码简化到最低限度,并提出了以下示例,该示例仍然引发错误:
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
template <typename MatType>
tuple<MatType, MatType> foo(const MatType& in)
{
MatType A(in.size(), in.type());
MatType B(in.size(), in.type());
return { A, B };
}
int main()
{
const int num_repetitions = 100;
const int downscale_factor = 5;
cv::Mat in = cv::Mat::ones({200,200}, CV_8U);
cv::Mat A_out, B_out;
tie(A_out, B_out) = foo(in); // no problem here
cv::UMat in_umat = in.getUMat(cv::ACCESS_READ);
cv::UMat A_umat, B_umat;
tie(A_umat, B_umat) = foo(in_umat); // no problem here
A_out = A_umat.getMat(cv::ACCESS_READ);
B_out = B_umat.getMat(cv::ACCESS_READ);
return 0; // we never get here
}
我不明白,我是否在管理某些cv::UMat
错误的寿命?