diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index aee377f665..6ce4ae89b4 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -279,21 +279,31 @@ Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange) : size(&r } *this = m; - if( _rowRange != Range::all() && _rowRange != Range(0,rows) ) + try { - CV_Assert( 0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows ); - rows = _rowRange.size(); - data += step*_rowRange.start; - flags |= SUBMATRIX_FLAG; - } + if( _rowRange != Range::all() && _rowRange != Range(0,rows) ) + { + CV_Assert( 0 <= _rowRange.start && _rowRange.start <= _rowRange.end + && _rowRange.end <= m.rows ); + rows = _rowRange.size(); + data += step*_rowRange.start; + flags |= SUBMATRIX_FLAG; + } - if( _colRange != Range::all() && _colRange != Range(0,cols) ) + if( _colRange != Range::all() && _colRange != Range(0,cols) ) + { + CV_Assert( 0 <= _colRange.start && _colRange.start <= _colRange.end + && _colRange.end <= m.cols ); + cols = _colRange.size(); + data += _colRange.start*elemSize(); + flags &= cols < m.cols ? ~CONTINUOUS_FLAG : -1; + flags |= SUBMATRIX_FLAG; + } + } + catch(...) { - CV_Assert( 0 <= _colRange.start && _colRange.start <= _colRange.end && _colRange.end <= m.cols ); - cols = _colRange.size(); - data += _colRange.start*elemSize(); - flags &= cols < m.cols ? ~CONTINUOUS_FLAG : -1; - flags |= SUBMATRIX_FLAG; + release(); + throw; } if( rows == 1 )