以下の頂いたプログラムに加え、検出した領域の面積をExcel出力することは可能でしょうか?
何度も申し訳ありませんが、よろしくお願い致します。
以下の頂いたプログラムに加え、検出した領域の面積をExcel出力することは可能でしょうか?
何度も申し訳ありませんが、よろしくお願い致します。
ご質問ありがとうございます。
コードを以下のように書き換えれば、面積が出力されると思います。
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の面積を書き出しています。