diff --git a/modules/core/src/copy.cpp b/modules/core/src/copy.cpp index d22e762b1f..49c9cb7e23 100644 --- a/modules/core/src/copy.cpp +++ b/modules/core/src/copy.cpp @@ -385,12 +385,21 @@ void Mat::copyTo( OutputArray _dst, InputArray _mask ) const CV_Assert( size() == mask.size() ); } - uchar* data0 = _dst.getMat().data; - _dst.create( dims, size, type() ); - Mat dst = _dst.getMat(); + Mat dst; + { + Mat dst0 = _dst.getMat(); + _dst.create(dims, size, type()); // TODO Prohibit 'dst' re-creation, user should pass it explicitly with correct size/type or empty + dst = _dst.getMat(); - if( dst.data != data0 ) // do not leave dst uninitialized - dst = Scalar(0); + if (dst.data != dst0.data) // re-allocation happened + { +#ifdef OPENCV_FUTURE + CV_Assert(dst0.empty() && + "copyTo(): dst size/type mismatch (looks like a bug) - use dst.release() before copyTo() call to suppress this message"); +#endif + dst = Scalar(0); // do not leave dst uninitialized + } + } CV_IPP_RUN_FAST(ipp_copyTo(*this, dst, mask))