טוב זה מה שיצא לי לבסוף.
אשמח לשמוע הערות והארות.
אני משתמש בספריה הזאת :
using Emgu.CV;
using Emgu.CV.Structure;
using System;
using System.Linq;
namespace MotionDetection
{
public static class ProcessImage
{
//אובייקט המצלמה
private static Capture capture = new Capture();
//הגדרת גודל הפריים, ככל שהוא קטן יותר כך ידרשו פחות משאבים לעיבוד התמונה
private static System.Drawing.Size frameSize = new System.Drawing.Size(640, 480);
private static Image<Bgr, Byte> currentFrame = new Image<Bgr, Byte>(frameSize);
private static Image<Bgr, Byte> previousFrame;
private static DateTime time;
private static Image<Gray, Byte> diff = new Image<Gray, Byte>(frameSize);
public static void ProcessFrame()
{
if (previousFrame == null)
{
currentFrame = capture.QueryFrame().ToImage<Bgr, Byte>();
time = DateTime.Now;
previousFrame = currentFrame.Copy();
}
else
{
currentFrame = capture.QueryFrame().ToImage<Bgr, Byte>();
if (haveMotion(currentFrame, previousFrame))
{
//להקליט את התנועה ולשמור ולשלוח
}
else
{
//אין תנועה ממשיכים בניטור
ProcessFrame();
}
}
}
/// <summary>
/// פונקציה שמשווה שתי תמונות ובודקת אם הייתה תזוזה
/// </summary>
/// <param name="currentImg"></param>
/// <param name="prevImg"></param>
/// <returns></returns>
private static bool haveMotion(Image<Bgr, Byte> currentImg, Image<Bgr, Byte> prevImg)
{
//המרת התמונות לאפור לצורך עיבוד קל
var grayCurrent = currentImg.Convert<Gray, byte>();
var grayPrev = prevImg.Convert<Gray, byte>();
//יצירת קובץ חדש שמכיל את השינויים
CvInvoke.AbsDiff(grayPrev, grayCurrent, diff);
//המרת הפיקסלים של התזוזה ללבן, והפיקסלים שלא השתנו לשחור
//הערך הראשון מגדיר מספר שממנו ומטה כולם יולבנו, כדי לסנן רעשים
var threso = diff.ThresholdBinary(new Gray(80), new Gray(255));
previousFrame = currentImg.Copy();
//כאשר הערך הוא 0 סימן שאין שינויים בין התמונות ולא הייתה תזוזה
var x = threso.CountNonzero();
//ככל שהערך קטן יותר זו תזוזה קלה מאד, לכן רצוי לא לשים 0 כדי לסנן רעשי רקע (אור וכדומה
if (x.Sum() > 1000)
{
return true;
}
else
{
return false;
}
}
}
}
השימוש ע"י קריאה בלולאה כך:
var success = true;
while (success)
{
ProcessImage.ProcessFrame();
}
שבת שלום!!
פורסם במקור בפורום CODE613 ב13/01/2017 15:08 (+02:00)