面積の出力方法

以下の頂いたプログラムに加え、検出した領域の面積をExcel出力することは可能でしょうか?

何度も申し訳ありませんが、よろしくお願い致します。

「いいね!」 2

ご質問ありがとうございます。

コードを以下のように書き換えれば、面積が出力されると思います。

using System.Text;
using System.IO;
// 検査をしない場合はnull 条件に一致する場合はtrue 条件に一致しない場合はfalse
bool? result = null;

// staticな変数を定義して画像間でカウントを共有
static int count = 0;
// blobのidと位置を覚えておくディクショナリ
static Dictionary<int, IBlob> idBlobDictionary = new Dictionary<int, IBlob>();
// 開始時刻とidを覚えておくディクショナリ
static Dictionary<int, DateTime> idStartTimeDictionary = new Dictionary<int, DateTime>();
// 距離閾値
const double distanceThreshold = 100.0;

// ペンの位置を取得
var blobs = GetInspectedBlobs("ペン検出");

// ペンが映っている時
if (blobs?.Any() == true)
{
    // 現在の時刻
    var dateTime = DateTime.Now;
    // ファイルが存在しているか
    var hasFile = File.Exists(@"D:\work\debug\test.csv");
    // csvに書き込み 既にファイルがある場合は続きから出力
    using (var sw = new StreamWriter(@"D:\work\debug\test.csv",hasFile, Encoding.UTF8))
    {
        // ファイルが存在しなかった時にヘッダーを出力
        if (!hasFile)
        {
            // ヘッダー
            sw.WriteLine("重心X,重心Y,前との距離,ID,累計カウント,開始時刻,現在時刻,追跡時間(ms),面積");
        }
        
        // トラッキング
        // 現在の画像でのペンの位置
        foreach (var blob in blobs)
        {
            var id = -1;
            var previousDistance = double.NaN;
            var blobPointD = CreatePointD(blob.Centroid.X, blob.Centroid.Y);
            // 前の画像のペンの位置
            foreach (var idBlob in idBlobDictionary)
            {
                var idBlobPointD = CreatePointD(idBlob.Value.Centroid.X, idBlob.Value.Centroid.Y);
                var distance = CalculateDistance(blobPointD, idBlobPointD);
                // 距離が近かったら同じものとみなす
                if (distance < distanceThreshold)
                {
                    // 前の画像と同じID
                    id = idBlob.Key;
                    // 情報を更新
                    idBlobDictionary[idBlob.Key] = blob;
                    previousDistance = distance;
                    break;
                }
            }

            // 前にいなかったペンだった時
            if (id == -1)
            {
                // 累計検出数を増やす
                count++;
                id = count;
                // ディクショナリに追加
                idBlobDictionary.Add(id, blob);
                // 現在の時刻を追加
                idStartTimeDictionary.Add(id, dateTime);
            }

            var startTime = idStartTimeDictionary[id];
            var startMs = startTime.Millisecond;
            var ms = dateTime.Millisecond;

            // ファイル書き込み
            sw.Write(blob.Centroid.X);
            sw.Write(",");
            sw.Write(blob.Centroid.Y);
            sw.Write(",");
            sw.Write(previousDistance);
            sw.Write(",");
            sw.Write(id);
            sw.Write(",");
            sw.Write(count);
            sw.Write(",");
            // エクセルで開くとmsが消失するのでシングルクォーテーションを挿入
            sw.Write("'" + startTime.ToString("yyyy/MM/dd HH:mm:ss") + "." + startMs);
            sw.Write(",");
            // エクセルで開くとmsが消失するのでシングルクォーテーションを挿入
            sw.Write("'" + dateTime.ToString("yyyy/MM/dd HH:mm:ss") + "." + ms);
            sw.Write(",");
            sw.Write((dateTime - startTime).TotalMilliseconds);
            sw.Write(",");
            sw.Write(blob.Area);
            sw.WriteLine("");
            
        }
    }
    // ペンが映っている時はtrue
    result = true;
}
// ペンが映っていない時
else
{
    // 映らなくなったら前の情報を破棄
    idBlobDictionary.Clear(); 
    // ペンが映っていない時はfalse
    result = false;
}

// カウント数を表示するために左上にBlobを描画
var blob = CreateBlob(CreatePointD(50, 50), 100, 100);
AddBlob("累計カウント : " + count, blob);

// resultは必ず最後の行に記述してください
result

具体的には、ヘッダーに面積を追加して、sw.Write()でblobの面積を書き出しています。

「いいね!」 1