0

画像内で検出されたすべてのブロブの中心を取得しようとしているので、2 つの異なる方法で実行しようとしましたが、2 つの異なる結果が得られました!
最初のものは次のとおりです。

        BlobCounter blobCounter = new BlobCounter();
        blobCounter.ObjectsOrder = ObjectsOrder.Area;
        blobCounter.ProcessImage(image);
        Blob[] blobs = blobCounter.GetObjectsInformation();
        AForge.Point Center = new AForge.Point();

        if (blobs.Length > 0)
        {
                Center.X = blobs.Average(c => c.CenterOfGravity.X);
                Center.Y = blobs.Average(c => c.CenterOfGravity.Y);
        }

2番目の方法は次のとおりです。

        System.Drawing.Point Center = new System.Drawing.Point();
        int count = 0;
        int sumX = 0;
        int sumY = 0;
        for(int i = 0 ;i<image.Width;i++)
            for (int j = 0; j < image.Height; j++)
            {
                var p = image.GetPixel(i,j);
                if (!p.Name.ToLower().Equals("ff000000"))
                {
                    sumX += i;
                    sumY += j;
                    count++;
                }
            }
        if (count > 0)
        {
            Center.X = sumX / count;
            Center.Y = sumY / count;
        }
        return Center;

どこ

!p.Name.ToLower().Equals("ff000000")

ピクセルが黒ではないことを意味します (つまり、ブロブからのものです)。
しかし、なぜ異なる結果が得られるのか理解できません! 誰かが私を助けて、理由を教えてもらえますか?

4

1 に答える 1

0

使用しているAForgeメソッドが何をしているのかを正確に調べなくても、問題は、平均の平均がそれらの部分の平均と等しくないことだと思います。

たとえば、私はこれらの数字を取ることができます:

  • 1
  • 3
  • 5
  • 7
  • 9

合わせて、それらの平均は(1 + 3 + 5 + 7 + 9)/ 5=5です。しかし、リストを{5,3}(平均4)と{1,7,9}(平均5.66 ...)に分割し、{4、5.66 ...}の平均を取ると、 5に近いが、5に等しくないものを取得します。

この場合、AForgeのCenterOfGravityメソッドは、平均化するオブジェクトの平均位置を返す可能性が高く、独自のメソッドは、すべてのオブジェクトのすべての部分の単一の平均を取得します。

無関係:より効率的な画像操作については、Bitmap.LockBitsを調べてください。

于 2013-03-21T02:55:06.403 に答える