<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[קוד לזיהוי תנועה]]></title><description><![CDATA[<p dir="rtl">אני משתמש בספריה emguCV (עטיפה דוטנטית לספריה OpenCV) ואני מנסה לכתוב פונקציה שתחזיר לי ערך בוליאני האם התרחשה תנועה או לא.</p>
<p dir="rtl">כתבתי את הקוד הבא: <a href="http://www.emgu.com/wiki/index.php?title=CompareImages_-_Difference" target="_blank" rel="noopener noreferrer nofollow ugc">ע"פ התיעוד שלהם כאן</a></p>
<pre><code>Capture capture;
        Image&lt;Bgr, Byte&gt; currentFrame = new Image&lt;Bgr, Byte&gt;(640, 480);  
        Image&lt;Bgr, Byte&gt; previousFrame; 
        Image&lt;Bgr, Byte&gt; Difference; 
        DateTime time;

        Image&lt;Gray, Byte&gt; des = new Image&lt;Gray, Byte&gt;(640, 480);
        Image&lt;Gray, Byte&gt; thres = new Image&lt;Gray, Byte&gt;(640, 480);
        Image&lt;Gray, Byte&gt; eroded = new Image&lt;Gray, Byte&gt;(640, 480); 

        public void ProcessFrame()
        {
            if (previousFrame == null) 
            {                
                currentFrame = capture.QueryFrame().ToImage&lt;Bgr, Byte&gt;();           
               
                time = DateTime.Now;
            }
            else
            {                
                currentFrame = capture.QueryFrame().ToImage&lt;Bgr, Byte&gt;();
                Difference = previousFrame.AbsDiff(currentFrame);
                Difference = Difference.ThresholdBinary(new Bgr(25, 25, 25), new Bgr(255, 255, 255)); 
         //איך אני יכול לדעת האם ישנם פיקסלים לבנים בתמונה??                                       
            
            }
        }
</code></pre>
<p dir="rtl">השאלה היא כיצד אני יכול לדעת האם ישנם פיקסלים לבנים בתמונה, שזה אומר שהייתה תזוזה, ואז אני רוצה להקליט את התנועה?<br />
אני מבין שיש פונקציה בשם erode אך אני לא מצליח להשתמש בה (ראיתי <a href="http://stackoverflow.com/questions/12580453/looking-for-a-function-for-motion-detection-on-emgucv" target="_blank" rel="noopener noreferrer nofollow ugc">כאן שהוא משתמש בה</a> אבל זה קוד ישן, והיום היא דורשת פרמטרים נוספים שאין לי מושג מהם <img src="https://tchumim.com/assets/plugins/nodebb-plugin-emoji/emoji/android/1f62e.png?v=cf1b4e11576" class="not-responsive emoji emoji-android emoji--open_mouth" style="height:23px;width:auto;vertical-align:middle" title=":o" alt="😮" /><br />
אשמח לעזרה!! תודה רבה!!</p>
<p dir="rtl"><em>פורסם במקור בפורום CODE613 ב12/01/2017 21:05 (+02:00)</em></p>
]]></description><link>https://tchumim.com/topic/1167/קוד-לזיהוי-תנועה</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 08:11:45 GMT</lastBuildDate><atom:link href="https://tchumim.com/topic/1167.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Jan 2018 11:36:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to קוד לזיהוי תנועה on Mon, 29 Jan 2018 11:36:41 GMT]]></title><description><![CDATA[<p dir="rtl">טוב זה מה שיצא לי לבסוף.<br />
אשמח לשמוע הערות והארות.<br />
אני משתמש בספריה הזאת :</p>
<pre><code>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&lt;Bgr, Byte&gt; currentFrame = new Image&lt;Bgr, Byte&gt;(frameSize);
        private static Image&lt;Bgr, Byte&gt; previousFrame;

        private static DateTime time;

        private static Image&lt;Gray, Byte&gt; diff = new Image&lt;Gray, Byte&gt;(frameSize);

        public static void ProcessFrame()
        {
            if (previousFrame == null)
            {
                currentFrame = capture.QueryFrame().ToImage&lt;Bgr, Byte&gt;();
                time = DateTime.Now;               
                previousFrame = currentFrame.Copy();
            }
            else
            {
                currentFrame = capture.QueryFrame().ToImage&lt;Bgr, Byte&gt;();
                if (haveMotion(currentFrame, previousFrame))
                {                   
                   //להקליט את התנועה ולשמור ולשלוח
                }
                else
                {
                    //אין תנועה ממשיכים בניטור
                    ProcessFrame();
                }

            }
        }
        /// &lt;summary&gt;
        /// פונקציה שמשווה שתי תמונות ובודקת אם הייתה תזוזה
        /// &lt;/summary&gt;
        /// &lt;param name="currentImg"&gt;&lt;/param&gt;
        /// &lt;param name="prevImg"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        private static bool haveMotion(Image&lt;Bgr, Byte&gt; currentImg, Image&lt;Bgr, Byte&gt; prevImg)
        {
            //המרת התמונות לאפור לצורך עיבוד קל
            var grayCurrent = currentImg.Convert&lt;Gray, byte&gt;();
            var grayPrev = prevImg.Convert&lt;Gray, byte&gt;();
            //יצירת קובץ חדש שמכיל את השינויים
            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() &gt; 1000)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}
</code></pre>
<p dir="rtl">השימוש ע"י קריאה בלולאה כך:</p>
<pre><code>var success = true;
            while (success)
            {
                ProcessImage.ProcessFrame();               
            }
</code></pre>
<p dir="rtl">שבת שלום!!</p>
<p dir="rtl"><em>פורסם במקור בפורום CODE613 ב13/01/2017 15:08 (+02:00)</em></p>
]]></description><link>https://tchumim.com/post/7811</link><guid isPermaLink="true">https://tchumim.com/post/7811</guid><dc:creator><![CDATA[avr416]]></dc:creator><pubDate>Mon, 29 Jan 2018 11:36:41 GMT</pubDate></item><item><title><![CDATA[Reply to קוד לזיהוי תנועה on Mon, 29 Jan 2018 11:36:40 GMT]]></title><description><![CDATA[<p dir="rtl"><a href="http://icode.co.il/%D7%9E%D7%90%D7%91%D7%98%D7%97%D7%99%D7%9D-%D7%90%D7%AA-%D7%94%D7%91%D7%99%D7%AA-%D7%91%D7%A4%D7%97%D7%95%D7%AA-%D7%9E-80-%D7%A9%D7%95%D7%A8%D7%95%D7%AA-%D7%A7%D7%95%D7%93/" target="_blank" rel="noopener noreferrer nofollow ugc">מצאתי כאן  פוסט יפה בעברית,</a> אך הוא עושה זאת בPyton.<br />
הקוד שלו הוא כזה:</p>
<pre><code>def have_motion(frame1, frame2):
    delta = cv2.absdiff(frame1, frame2)
    thresh = cv2.threshold(delta, 25, 255, cv2.THRESH_BINARY)[1]
    return numpy.sum(thresh) &gt; 0
</code></pre>
<p dir="rtl">השאלה שלי היא מה עושה הפונקציה: numpy.sum (אני מבין שnumpy זו הספריה המתמטית של pyton), וכיצד אני יכול  לעשות משהו דומה בC#?</p>
<p dir="rtl">תודה רבה רבה מראש לכולם!!<br />
שבת שלום.<br />
אברהם</p>
<p dir="rtl"><em>פורסם במקור בפורום CODE613 ב13/01/2017 09:30 (+02:00)</em></p>
]]></description><link>https://tchumim.com/post/7810</link><guid isPermaLink="true">https://tchumim.com/post/7810</guid><dc:creator><![CDATA[avr416]]></dc:creator><pubDate>Mon, 29 Jan 2018 11:36:40 GMT</pubDate></item></channel></rss>