Мне нужно сделать почти то, что сказано в Эффективное вычитание фона с помощью OpenCV (вычитание фона с помощью передний план с цветом, за исключением камеры, а не видеофайла). Проблема в том, что в той теме нет объяснения самой фазы вычитания фона.
Я просмотрел официальную книгу openCV и в Интернете, и простого Frame Differenceing недостаточно для того, что мне нужно. Я пытался понять более сложный Метод усреднения фона, но я теряюсь после cvAcc кадров, чтобы получить среднее значение:/
Если бы кто-нибудь мог мне немного помочь, я был бы очень признателен.
Спасибо!
EDIT с кодом, который у меня уже есть:
Сумма
cvCvtScale( currentFrame, currentFloat, 1, 0 );
if(totalFrames == 0)
cvCopy(currentFloat, sum);
else
cvAcc(currentFloat, sum);
средний
cvConvertScale( sum, imgBG, (double)(1.0/totalFrames) );
адаптированный фон (альфа равна 0,05 в #define)
cvRunningAvg(currentFrame, imgBG, alpha);
Создание конечного изображения только с передним планом (далеко от совершенства!)
void createForeground(IplImage* imgDif,IplImage * currentFrame)
{
cvCvtColor(imgDif, grayFinal, CV_RGB2GRAY);
cvSmooth(grayFinal, grayFinal);
cvThreshold(grayFinal, grayFinal, 40, 255, CV_THRESH_BINARY);
unsigned char *greyData= reinterpret_cast<unsigned char *>(grayFinal->imageData);
unsigned char *currentData= reinterpret_cast<unsigned char *>(currentFrame->imageData);
unsigned char *fgData= reinterpret_cast<unsigned char *>(currentFrame->imageData);
int i=0;
for(int j=0 ; j<(grayFinal->width*grayFinal->height) ; j++)
{
if(greyData[j]==0)
{
fgData[i]=0;
fgData[i+1]=0;
fgData[i+2]=0;
i=i+3;
}
else
{
fgData[i]= currentData[i];
fgData[i+1]= currentData[i+1];
fgData[i+2]= currentData[i+2];
i=i+3;
}
}
cvSetData( imgFG , fgData , imgFG->width*imgFG->nChannels);
}
ПРОБЛЕМА ПРЯМО СЕЙЧАС!
Самая большая проблема сейчас заключается в том, что когда у меня есть лампочка где-то на картинке, после того, как я держу руку «поверх» ее в течение нескольких секунд, когда я убираю ее, свет остается на переднем плане в течение длительного времени. , любая помощь в этом?