void Mat::copyTo( Mat& dst, const Mat& mask ) const { if( !mask.data ) { copyTo(dst); return; } uchar* data0 = dst.data; dst.create( size(), type() ); if( dst.data != data0 ) // do not leave dst uninitialized dst = Scalar(0); getCopyMaskFunc((int)elemSize())(*this, dst, mask); }
Mat& Mat::setTo(InputArray _value, InputArray _mask) { if( !data ) return *this; Mat value = _value.getMat(), mask = _mask.getMat(); CV_Assert( checkScalar(value, type(), _value.kind(), _InputArray::MAT )); CV_Assert( mask.empty() || mask.type() == CV_8U ); size_t esz = elemSize(); BinaryFunc copymask = getCopyMaskFunc(esz); const Mat* arrays[] = { this, !mask.empty() ? &mask : 0, 0 }; uchar* ptrs[2]={0,0}; NAryMatIterator it(arrays, ptrs); int total = (int)it.size, blockSize0 = std::min(total, (int)((BLOCK_SIZE + esz-1)/esz)); AutoBuffer<uchar> _scbuf(blockSize0*esz + 32); uchar* scbuf = alignPtr((uchar*)_scbuf, (int)sizeof(double)); convertAndUnrollScalar( value, type(), scbuf, blockSize0 ); for( size_t i = 0; i < it.nplanes; i++, ++it ) { for( int j = 0; j < total; j += blockSize0 ) { Size sz(std::min(blockSize0, total - j), 1); size_t blockSize = sz.width*esz; if( ptrs[1] ) { copymask(scbuf, 0, ptrs[1], 0, ptrs[0], 0, sz, &esz); ptrs[1] += sz.width; } else memcpy(ptrs[0], scbuf, blockSize); ptrs[0] += blockSize; } } return *this; }
void Mat::copyTo( OutputArray _dst, InputArray _mask ) const { Mat mask = _mask.getMat(); if( !mask.data ) { copyTo(_dst); return; } int cn = channels(), mcn = mask.channels(); CV_Assert( mask.depth() == CV_8U && (mcn == 1 || mcn == cn) ); bool colorMask = mcn > 1; size_t esz = colorMask ? elemSize1() : elemSize(); BinaryFunc copymask = getCopyMaskFunc(esz); uchar* data0 = _dst.getMat().data; _dst.create( dims, size, type() ); Mat dst = _dst.getMat(); if( dst.data != data0 ) // do not leave dst uninitialized dst = Scalar(0); if( dims <= 2 ) { CV_Assert( size() == mask.size() ); Size sz = getContinuousSize(*this, dst, mask, mcn); copymask(data, step, mask.data, mask.step, dst.data, dst.step, sz, &esz); return; } const Mat* arrays[] = { this, &dst, &mask, 0 }; uchar* ptrs[3]; NAryMatIterator it(arrays, ptrs); Size sz((int)(it.size*mcn), 1); for( size_t i = 0; i < it.nplanes; i++, ++it ) copymask(ptrs[0], 0, ptrs[2], 0, ptrs[1], 0, sz, &esz); }