Я написал небольшую программу для тестирования алгоритма при использовании cv::Mat
против cv::UMat
.Код выполняется без ошибок до конца main
, когда происходит сбой с ошибкой подтверждения, возникшей в UMat::release
:
OpenCV (3.4.3) Ошибка: подтверждение не выполнено (u-> refcount== 0) в cv :: StdMatAllocator :: deallocate, файл c: \velop \ 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
неправильно?