7

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 で修正されました。

4

4 に答える 4

9

OpenCV のソース コードを調べたところ、 file で興味深い初期化が見つかりました/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));

method を使用して、これらの 4 つのパラメーターのみを設定することは可能のようsetです。

また、クラスmodules/video/src/bgfg_gaussmix2.cppを持つfile も見てください。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 バグトラッカーに直接投稿できます。

于 2012-10-15T22:28:15.947 に答える
4

はい、bgr.set("nmixtures",3);動作するはずです。BackgroundSubtractorMOG2は から継承するcv::Algorithmため、これらのパラメータにアクセスするにはcv:Algorithm::getとを使用します。cv::Algorithm::setあなたはそれを試しましたが、うまくいきませんか?

于 2012-10-12T14:57:26.417 に答える
2

これらのパラメーターは保護されているため、派生クラスはそれらにアクセスできます。必要なすべてのパラメーターを設定する派生クラスを作成しました。

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;
}
于 2013-03-21T21:31:42.630 に答える
1

ではandroid、アルゴリズム関数を使用します: setDoublesetIntsetBool: これは機能します:

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);
于 2014-12-18T11:52:31.607 に答える