Невозможно установить пользовательские параметры в 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?

EDIT Как правильно указано в ответе ниже, это была ошибка в OpenCV. Ошибка была исправлена ​​в OpenCV версии 2.4.6.


person Alexey    schedule 12.10.2012    source источник
comment
В более ранних версиях OpenCV nmixtures и другие параметры были общедоступными, но они были изменены в версии 2.4.   -  person Alexey    schedule 12.10.2012
comment
разместил вопрос на доске OpenCV. Все еще нет ответа.   -  person Alexey    schedule 12.10.2012


Ответы (4)


Я только что просмотрел исходный код 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.

person ArtemStorozhuk    schedule 15.10.2012
comment
Моя проблема http://stackoverflow.com/questions/17284712/error-in-backgroundsubtraction-mog2 такая же, как эта? - person ; 27.06.2013

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

person Sassa    schedule 12.10.2012
comment
bgr.set("nmixtures",3); работает, а bgr.set("bShadowDetection", false); нет. - person Alexey; 12.10.2012
comment
Как насчет того, чтобы установить его в конструкторе, например что. Это работает? - person Sassa; 12.10.2012
comment
Да, я думаю, лучший вариант - установить все свойства в конструкторе. Кажется, что некоторые параметры нельзя изменить даже через cv::Algorithm интерфейс. answers.opencv.org/question/1310 / - person Alexey; 12.10.2012
comment
Вероятно, геттеры и сеттеры не определены для bShadowDetection. Я думаю, что вы можете использовать set и get для всех упомянутых параметров здесь - person Sassa; 12.10.2012
comment
Когда я делаю bgr.set("fVarMin", 5); (это один из определяемых пользователем параметров), код компилируется, но я получаю ошибку времени запуска. Так почему-то не работает.. - person Alexey; 12.10.2012
comment
Ставится или нет? Что он возвращает, используя Algorithm::get? Если он возвращает 5, это означает, что он действительно работает, но по какой-то причине это значение вызывает ошибку времени выполнения. Если это так, то это не имеет ничего общего с сеттером. Вы получаете время выполнения именно на этой строке? - person Sassa; 12.10.2012
comment
Не думайте, что это значение, код вылетает ровно на bgr.set("fVarMin", 5); строке, а значение bgr.fVarMin не меняется. Я пробовал bgr.set("fVarMin", (float)5);, но все равно вылетает. - person Alexey; 12.10.2012
comment
Я не читал эту статью, что представляет собой fVarMin? Вы пробовали с другими значениями? Говорит ли он что-нибудь еще, кроме ошибки времени выполнения? - person Sassa; 12.10.2012
comment
Ошибка говорит Access violation reading location 0x0000000000000008. Также вылетает для bgr.set("backgroundRatio", 0.9). Все эти параметры настраиваются пользователем, и все соответствующие значения, которые я пытаюсь установить для них, находятся в пределах допустимого диапазона (например, значение по умолчанию для bgr.backgroundRatio равно 0,9). - person Alexey; 12.10.2012
comment
@Alex Это может быть глупо, но вы пробовали bgr.set(backgroundRatio, 0.9f); - person Sassa; 16.10.2012
comment
пробовал - не повезло. Также пробовал bgr.set("backgroundRatio", (float) 0.9), но выдает ту же ошибку во время выполнения. - person Alexey; 16.10.2012

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

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;
}
person DXM    schedule 21.03.2013

В 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);
person Abe    schedule 18.12.2014