粒子フィルター アルゴリズムの実装を開発するために、追跡するオブジェクトに関連する動きに関する仮説を生成する必要があります。N 個のサンプルを設定し、 2 行 1 列の状態ベクトルを使用すると、各ステップでN組のランダム値 ( 2 行 N 列の行列)を生成する必要があります。さらに、動きの統計 (平均と標準偏差) がわかっていれば、平均と標準偏差を使用して N 個の値すべてを生成できます。最後に、動きの不確実性をモデル化するために、ノイズ マトリックス ( 2 行 N 列のマトリックス) を生成し、それを動きのマトリックスに追加します。
これらの前提に基づいて、matlab で実行されるアルゴリズムを実装し、動きの仮説を生成するために次のコードを使用しました。
ds_mean = [dx_mean dy_mean];
ds_stddev = [dx_stddev dy_stddev];
d = 5;
V = zeros(2,N);
V(1,:) = normrnd(ds_mean(1),ds_stddev(1),1,N); % hypotheses of movement on x axis
V(2,:) = normrnd(ds_mean(2),ds_stddev(2),1,N); % hypotheses of movement on y axis
E = d*randn(2,N); % weighted noise
M = V + E; % hypotheses of movement
C++ と OpenCV を使用して同じアルゴリズムを実装しなければならなかったときに問題が発生しました。実質的には、上記の matlab コードは適切な予測を生成しますが (うまく機能します)、代わりに C++ で記述された同じコード (以下のコードを参照) は不十分な予測を生成します (つまり、物体から遠く離れている)。なんで?
RNG m_rng;
x_mean = // ...
y_mean = // ...
x_stddev = // ...
y_stddev = // ...
Mat velocity(STATE_DIM, NUM_PARTICLES, DataType<double>::type);
m_rng.fill(velocity.row(0), RNG::NORMAL, x_mean, x_stddev);
m_rng.fill(velocity.row(1), RNG::NORMAL, y_mean, y_stddev);
Mat noise(STATE_DIM, NUM_PARTICLES, DataType<double>::type);
m_rng.fill(noise,RNG::NORMAL,0,1);
noise *= d; % weighted noise
movements = velocity + noise;
C++ アルゴリズムが matlab に実装されたアルゴリズムと同様に機能することを確認するにはどうすればよいですか?