そのため、実験のために、アパートの窓から短いビデオを撮影し、それをフレームに分割し、写真の形式でいくつかのフレームを保存しました。
動きの事実を判断するために、私はこれまで単純な方法で行くことに決めました。画像をマトリックスに変え、2番目のマトリックスから最初の(要素ごと)を引きます。 この処理を行うC#コードは次のとおりです。
/// <summary> /// /// </summary> /// <param name="file_name"> </param> private ImageMatrix crate_matrix(string file_name) { Bitmap picture = new Bitmap(file_name); ImageMatrix res = new ImageMatrix(); using (var wrapper = new ImageWrapper(picture,true)) { res.matrix = new int[wrapper.Width, wrapper.Height]; for (int i = 0; i < wrapper.Width; i++) { for (int j = 0; j < wrapper.Height; j++) { Color color = wrapper[i, j]; res.matrix[i, j] = (color.R + color.G + color.B) / 3; } } res.height = wrapper.Height; res.width = wrapper.Width; res.picture = picture; } return res; } private void tsmiDifference_Click(object sender, EventArgs e) { ImageMatrix matrix1 = crate_matrix("D:\\3\\1.png"); ImageMatrix matrix2 = crate_matrix("D:\\3\\2.png"); Bitmap picture = new Bitmap(matrix1.picture); using (var wrapper = new ImageWrapper(picture, true)) { for (int i = 0; i < wrapper.Width; i++) { for (int j = 1; j < wrapper.Height; j++) { int light1 = matrix1.matrix[i, j]; int light2 = matrix2.matrix[i, j]; int light = Math.Abs(light2-light1); wrapper[i, j] = Color.FromArgb(light, light, light); } } pbImage.Image = picture; } }
そして、これはこのアルゴリズムの実行中に起こったことです:
結果のマトリックスには、車の密閉された輪郭と背景のその他の輪郭が表示されます。これは、手の震えや射撃時に発生した雨のために発生した可能性が高いです。 写真では雨は見えませんが、ビデオでははっきりと見えます。
認識の品質を向上させるために、プログラムに特定のしきい値を入力できます。
if(light <50)light = 0; それ以外の場合、ライト= 255;
結果は完全に異なります。
ご覧のとおり、単純にマトリックスを減算し、しきい値を使用することで、動的な画像内で動いているオブジェクトを特定することができました。 受信したデータをさらにどうするか? 実際、私たちが現在持っているのはバイナリ画像です。 動いているオブジェクトを定義するいくつかのスポットがあります。 ご覧のように、ノイズはアルゴリズムコンパートメントです。 将来的には、検出された動きの領域の座標を決定できます。 確かに、いくつかの動くオブジェクトがあります-その座標を決定しようとするときの各スポットは別々のオブジェクトです。 しかし、この方法で複数のマトリックスを処理すると、複数のオブジェクトが同期して移動することに気付くことができます。これにより、それらを単一のオブジェクトに関連付けることができます。
ただし、ここで指定されたアルゴリズムは、モーションを決定する唯一の方法ではありません。 私の記事が気に入ったら、トピックを続け、モーション認識とパターン認識のための他のアルゴリズムについてお話します。