Commit c9f51d5e authored by Firat Kalaycilar's avatar Firat Kalaycilar

modified BackgroundSubtractorMOG2::getBackgroundImage so that it can now work…

modified BackgroundSubtractorMOG2::getBackgroundImage so that it can now work with gray-level images.
parent 034ef024
...@@ -577,54 +577,49 @@ void BackgroundSubtractorMOG2::operator()(InputArray _image, OutputArray _fgmask ...@@ -577,54 +577,49 @@ void BackgroundSubtractorMOG2::operator()(InputArray _image, OutputArray _fgmask
void BackgroundSubtractorMOG2::getBackgroundImage(OutputArray backgroundImage) const void BackgroundSubtractorMOG2::getBackgroundImage(OutputArray backgroundImage) const
{ {
int nchannels = CV_MAT_CN(frameType); int nchannels = CV_MAT_CN(frameType);
CV_Assert( nchannels == 3 ); CV_Assert(nchannels == 1 || nchannels == 3);
Mat meanBackground(frameSize, CV_8UC3, Scalar::all(0)); Mat meanBackground(frameSize, CV_MAKETYPE(CV_8U, nchannels), Scalar::all(0));
int firstGaussianIdx = 0; int firstGaussianIdx = 0;
const GMM* gmm = (GMM*)bgmodel.data; 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 row=0; row<meanBackground.rows; row++)
{ {
for(int col=0; col<meanBackground.cols; col++) for(int col=0; col<meanBackground.cols; col++)
{ {
int nmodes = bgmodelUsedModes.at<uchar>(row, col); int nmodes = bgmodelUsedModes.at<uchar>(row, col);
Vec3f meanVal; std::vector<float> meanVal(nchannels, 0.f);
float totalWeight = 0.f; float totalWeight = 0.f;
for(int gaussianIdx = firstGaussianIdx; gaussianIdx < firstGaussianIdx + nmodes; gaussianIdx++) for(int gaussianIdx = firstGaussianIdx; gaussianIdx < firstGaussianIdx + nmodes; gaussianIdx++)
{ {
GMM gaussian = gmm[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; totalWeight += gaussian.weight;
if(totalWeight > backgroundRatio) if(totalWeight > backgroundRatio)
break; break;
} }
float invWeight = 1.f/totalWeight;
meanVal *= (1.f / totalWeight); for(int chn = 0; chn < nchannels; chn++)
meanBackground.at<Vec3b>(row, col) = Vec3b(meanVal); {
firstGaussianIdx += nmixtures; meanVal[chn] *= invWeight;
}
} }
switch(nchannels)
switch(CV_MAT_CN(frameType))
{ {
case 1: case 1:
{ meanBackground.at<uchar>(row, col) = (uchar)meanVal[0];
vector<Mat> channels;
split(meanBackground, channels);
channels[0].copyTo(backgroundImage);
break; break;
}
case 3: case 3:
{ meanBackground.at<Vec3b>(row, col) = Vec3b(*reinterpret_cast<Vec3f*>(&meanVal[0]));
meanBackground.copyTo(backgroundImage);
break; break;
} }
firstGaussianIdx += nmixtures;
default:
CV_Error(CV_StsUnsupportedFormat, "");
} }
}
meanBackground.copyTo(backgroundImage);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment