Невозможно установить пользовательские параметры в BackgroundSubtractorMOG2

Библиотека OpenCV версии 2.42. Я хотел бы установить параметр в BackgroundSubtractorMOG2 объект, например

BackgroundSubtractorMOG2 bgr;

// the following doesn't work because 'nmixtures', 'backgroundRatio'
// and 'fVarMin' are a protected members.
bgr.nmixtures = 3;
bgr.backgroundRatio = 0.9;
bgr.fVarMin = 5;

// the following works
bgr.set('nmixtures', 3);

// both of the following lines will give a run-time error
// `Access violation reading location 0x0000000000000008.`
bgr.set("backgroundRatio", 0.9);
bgr.set("fVarMin", 5);

backgroundRatio а также fVarMin это параметры, которые контролируют алгоритм. Пользователь должен иметь возможность изменять эти параметры в соответствии с документация.

Как я могу установить параметры BackgroundSubtractorMOG2?

РЕДАКТИРОВАТЬ Как правильно указано в ответе ниже, это была ошибка в OpenCV. Ошибка была исправлена ​​в OpenCV версии 2.4.6.

7

Решение

Я только что посмотрел исходный код OpenCV и нашел интересную инициализацию в файле /modules/video/src/video_init.cpp, Вот:

CV_INIT_ALGORITHM(BackgroundSubtractorMOG2, "BackgroundSubtractor.MOG2",
obj.info()->addParam(obj, "history", obj.history);
obj.info()->addParam(obj, "nmixtures", obj.nmixtures);
obj.info()->addParam(obj, "varThreshold", obj.varThreshold);
obj.info()->addParam(obj, "detectShadows", obj.bShadowDetection));

Кажется, что можно установить только эти четыре параметра, используя метод set,

А также взглянуть на файл modules/video/src/bgfg_gaussmix2.cpp, который имеет BackgroundSubtractorMOG2 учебный класс. Имеет следующие поля:

float fVarInit;
float fVarMax;
float fVarMin;
//initial standard deviation  for the newly generated components.
//It will will influence the speed of adaptation. A good guess should be made.
//A simple way is to estimate the typical standard deviation from the images.
//I used here 10 as a reasonable value

И значение fVarMin (который вы хотите изменить) устанавливается на:

fVarMin = defaultVarMin2

в обоих конструкторах. Вот все из них:

static const float defaultVarInit2 = 15.0f; // initial variance for new components
static const float defaultVarMax2 = 5*defaultVarInit2;
static const float defaultVarMin2 = 4.0f;

И интересный факт, что это значение не используется ни в одном другом файле, поэтому кажется, что изменить его сейчас невозможно. Вы можете опубликовать эту проблему прямо на Багтрекер OpenCV.

9

Другие решения

Да, bgr.set("nmixtures",3); должно сработать. BackgroundSubtractorMOG2 наследуется от cv::Algorithmтак что вы используете cv:Algorithm::get а также cv::Algorithm::set чтобы получить доступ к этим параметрам. Вы пробовали это, и это не работает?

4

Поскольку эти параметры защищены, производный класс может получить к ним доступ. Я сделал производный класс, чтобы установить все необходимые параметры.

struct BackgroundModel2ParameterBlock {
int nmixtures;
float backgroundRatio;
float varThresholdGen;
float fVarInit;
float fVarMin;
float fVarMax;
BackgroundModel2ParameterBlock(void) :
nmixtures(3),
backgroundRatio(0.6),
varThresholdGen(6.25),
fVarInit(256),
fVarMin(256),
fVarMax(9e2)
{ }
};

class BackgroundModel2 : public cv::BackgroundSubtractorMOG2 {
private:
BackgroundModel2ParameterBlock m_param;
};

BackgroundModel2::BackgroundModel2(BackgroundModel2ParameterBlock param):
BackgroundSubtractorMOG2(),
m_param(param)
{
nmixtures = m_param.nmixtures;
backgroundRatio = m_param.backgroundRatio;
varThresholdGen = m_param.varThresholdGen;
fVarInit = m_param.fVarInit;
fVarMin = m_param.fVarMin;
fVarMax = m_param.fVarMax;
}
2

В android, используйте функции алгоритма: setDouble, setInt, setBool:
это работает:

mBgMog2 = new BackgroundSubtractorMOG2(mHistory,mMog2Threshold );
mBgMog2.setInt("nmixtures" , 3);
mBgMog2.setDouble("fVarInit" , 80.0);
mBgMog2.setDouble("fTau" , 0.2);
mBgMog2.setDouble("fVarMin" , 200.0);
mBgMog2.setDouble("fVarMax" , 80.0);
mBgMog2.setBool("detectShadows",false);
1