カメラ フィードから背景を差し引いてきれいなブロブを抽出
する EMGU (openCV ラッパー) プログラムがあります。
ここで、これらのブロブを追跡して ID を割り当てるものが必要です。
提案/ライブラリはありますか?
ありがとう、
SW
2 に答える
追跡したいオブジェクトが複数ある場合は、Particle Filterを試すことができます。
粒子フィルターは、基本的に、それぞれが特定の重みを持つ画像上の粒子を「配置」します。各時間ステップで、これらの重みは、その時点でのオブジェクトの実際の測定値と比較することによって更新されます。重みの大きいパーティクルは、次の時間ステップのために、その方向により多くのパーティクルを配置します (方向にわずかにランダムな部分を追加します)。いくつかの時間ステップの後、パーティクルはオブジェクトの測定位置の周りにグループ化されます。そのため、この方法は適者生存法とも呼ばれます...
したがって、この全体が円を構築します。
Initialization ----> Sampling
> \
/ >
Updating Prediction
< /
\ <
Association
したがって、これは、特定のシーンでオブジェクトを追跡するための優れた方法を提供します。マルチオブジェクト トラッキングを行う 1 つの方法は、すべてのオブジェクトでこの 1 つのパーティクル フィルタを使用することです。これは機能しますが、オブジェクトに ID を与えようとするとき、およびオブジェクトが互いに交差するときに、パーティクル クラウドが1 つのオブジェクトを失い、別のオブジェクトに従います。
これを解決するには、Mixture-Particle-Filter (Vermaak et al. [2003]) を試すことができます。これは、個々の粒子フィルターによって各オブジェクトを追跡します (もちろん、必要な粒子は少なくなります)。
それに関する良い論文はここにあります : http://www.springerlink.com/content/qn4704415gx65315/少し前に私の大学でそれについてのプレゼンテーションを行いました)
編集:
言及するのを忘れました:OpenCVでこれをやろうとしているので:私が知る限り、圧縮アルゴリズムの実装があります(画像全体で1つの粒子フィルターを使用する最初のもの)はOpenCVディストリビューションの一部ですが、少し古いかもしれません。OpenCV で粒子フィルターを直接使用する新しい方法があるかもしれませんが、そうでない場合は、OpenCV と粒子フィルターを探すと、Google で多くの結果が見つかります。
お役に立てば幸いです...そうでない場合は、引き続き質問してください...
VideoSurveillance 名前空間を利用する EMGU CV の例の 1 つを単純に適応させることができます。
public partial class VideoSurveilance : Form
{
private static MCvFont _font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0);
private static Capture _cameraCapture;
private static BlobTrackerAuto<Bgr> _tracker;
private static IBGFGDetector<Bgr> _detector;
public VideoSurveilance()
{
InitializeComponent();
Run();
}
void Run()
{
try
{
_cameraCapture = new Capture();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return;
}
_detector = new FGDetector<Bgr>(FORGROUND_DETECTOR_TYPE.FGD);
_tracker = new BlobTrackerAuto<Bgr>();
Application.Idle += ProcessFrame;
}
void ProcessFrame(object sender, EventArgs e)
{
Image<Bgr, Byte> frame = _cameraCapture.QueryFrame();
frame._SmoothGaussian(3); //filter out noises
#region use the background code book model to find the forground mask
_detector.Update(frame);
Image<Gray, Byte> forgroundMask = _detector.ForgroundMask;
#endregion
_tracker.Process(frame, forgroundMask);
foreach (MCvBlob blob in _tracker)
{
frame.Draw(Rectangle.Round(blob), new Bgr(255.0, 255.0, 255.0), 2);
frame.Draw(blob.ID.ToString(), ref _font, Point.Round(blob.Center), new Bgr(255.0, 255.0, 255.0));
}
imageBox1.Image = frame;
imageBox2.Image = forgroundMask;
}
}