modified BackgroundSubtractorMOG2::getBackgroundImage so that it can now work with gray-level images.
This commit is contained in:
parent
034ef02409
commit
c9f51d5eed
@ -577,54 +577,49 @@ void BackgroundSubtractorMOG2::operator()(InputArray _image, OutputArray _fgmask
|
||||
void BackgroundSubtractorMOG2::getBackgroundImage(OutputArray backgroundImage) const
|
||||
{
|
||||
int nchannels = CV_MAT_CN(frameType);
|
||||
CV_Assert( nchannels == 3 );
|
||||
Mat meanBackground(frameSize, CV_8UC3, Scalar::all(0));
|
||||
|
||||
CV_Assert(nchannels == 1 || nchannels == 3);
|
||||
Mat meanBackground(frameSize, CV_MAKETYPE(CV_8U, nchannels), Scalar::all(0));
|
||||
int firstGaussianIdx = 0;
|
||||
const GMM* gmm = (GMM*)bgmodel.data;
|
||||
const Vec3f* mean = reinterpret_cast<const Vec3f*>(gmm + frameSize.width*frameSize.height*nmixtures);
|
||||
const float* mean = reinterpret_cast<const float*>(gmm + frameSize.width*frameSize.height*nmixtures);
|
||||
for(int row=0; row<meanBackground.rows; row++)
|
||||
{
|
||||
for(int col=0; col<meanBackground.cols; col++)
|
||||
{
|
||||
int nmodes = bgmodelUsedModes.at<uchar>(row, col);
|
||||
Vec3f meanVal;
|
||||
std::vector<float> meanVal(nchannels, 0.f);
|
||||
float totalWeight = 0.f;
|
||||
for(int gaussianIdx = firstGaussianIdx; gaussianIdx < firstGaussianIdx + nmodes; gaussianIdx++)
|
||||
{
|
||||
GMM gaussian = gmm[gaussianIdx];
|
||||
meanVal += gaussian.weight * mean[gaussianIdx];
|
||||
size_t meanPosition = gaussianIdx*nchannels;
|
||||
for(int chn = 0; chn < nchannels; chn++)
|
||||
{
|
||||
meanVal[chn] += gaussian.weight * mean[meanPosition + chn];
|
||||
}
|
||||
totalWeight += gaussian.weight;
|
||||
|
||||
if(totalWeight > backgroundRatio)
|
||||
break;
|
||||
}
|
||||
|
||||
meanVal *= (1.f / totalWeight);
|
||||
meanBackground.at<Vec3b>(row, col) = Vec3b(meanVal);
|
||||
float invWeight = 1.f/totalWeight;
|
||||
for(int chn = 0; chn < nchannels; chn++)
|
||||
{
|
||||
meanVal[chn] *= invWeight;
|
||||
}
|
||||
switch(nchannels)
|
||||
{
|
||||
case 1:
|
||||
meanBackground.at<uchar>(row, col) = (uchar)meanVal[0];
|
||||
break;
|
||||
case 3:
|
||||
meanBackground.at<Vec3b>(row, col) = Vec3b(*reinterpret_cast<Vec3f*>(&meanVal[0]));
|
||||
break;
|
||||
}
|
||||
firstGaussianIdx += nmixtures;
|
||||
}
|
||||
}
|
||||
|
||||
switch(CV_MAT_CN(frameType))
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
vector<Mat> channels;
|
||||
split(meanBackground, channels);
|
||||
channels[0].copyTo(backgroundImage);
|
||||
break;
|
||||
}
|
||||
|
||||
case 3:
|
||||
{
|
||||
meanBackground.copyTo(backgroundImage);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
CV_Error(CV_StsUnsupportedFormat, "");
|
||||
}
|
||||
meanBackground.copyTo(backgroundImage);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user