{"id":2242,"date":"2014-02-06T11:36:32","date_gmt":"2014-02-06T11:36:32","guid":{"rendered":"http:\/\/www.ollmetzer.com\/?p=2242"},"modified":"2014-02-06T11:36:32","modified_gmt":"2014-02-06T11:36:32","slug":"bewegungserkennung-per-webcam","status":"publish","type":"post","link":"https:\/\/www.ollmetzer.com\/?p=2242","title":{"rendered":"Bewegungserkennung per Webcam"},"content":{"rendered":"<p>F\u00fcr ein kleines Projekt stand gerade vor der Aufgabe, Standbilder per Webcam aufzunehmen und zu speichern &#8211; aber nur, wenn sich etwas vor der Linse bewegt.<br \/>\nDas klingt zun\u00e4chst reichlich kompliziert, aber mit den richtigen Werkzeugen ist es tats\u00e4chlich verbl\u00fcffend einfach. Die Werkzeuge der Wahl sind:<\/p>\n<ul>\n<li><a title=\"Python Programming Language\" href=\"http:\/\/python.org\/\" target=\"extern\">Python<\/a> &#8211; Eine popul\u00e4re Skriptsprache<\/li>\n<li><a title=\"Open Source Computer Vision Library\" href=\"http:\/\/opencv.org\/\" target=\"extern\">OpenCV<\/a> &#8211; Eine Funktionsbibliothek f\u00fcr Bild-, Videobearbeitung, Mustererkennung u.\u00e4.<\/li>\n<\/ul>\n<p>Den rechten Weg wies mir Matthias Stein mit seinem Artikel &#8222;<a title=\"Bewegungserkennung  mit Webcam, Python, OpenCV und Differenzbildern\" href=\"http:\/\/www.steinm.com\/blog\/motion-detection-webcam-python-opencv-differential-images\/\" target=\"extern\">Motion detection using a webcam, Python, OpenCV and Differential Images<\/a>&#8222;. Die Bewegungserkennung funktioniert so, dass drei kurz nacheinender aufgenommene Bilder \u00fcbereinandergelegt werden und daraus ein Differenzbild errechnet wird. Dort wo sich nichts ver\u00e4ndert hat, ist das Differenzbild schwarz. Stellen, die sich ver\u00e4ndert haben, werden wei\u00df. Das f\u00fchrt zu recht eigenwilligen, geisterhaften Bildern, wie man in dem <a title=\"Motion detection with Python and OpenCV\" href=\"http:\/\/www.youtube.com\/watch?v=8VNmpyii-gE\" target=\"_blank\">Beispielvideo auf Youtube<\/a> sehen kann.<\/p>\n<p><strong>Die L\u00f6sung<\/strong><\/p>\n<p>Die Methode musste ich nun nur noch etwas erg\u00e4nzen. Aus dem Differenzbild errechnet die OpenCV Methode countNonZero die Anzahl, der wei\u00dfen Pixel. Falls dieser Wert oberhalb eines gesetzten Schwellwertes (sinnvollen Wert ausprobieren) liegt, soll das Bild gespeichert werden. Jetzt muss man nur noch daf\u00fcr sorgen, dass das Ursprungsbild in Farbe vorliegt und nur zur Differenzberechnung in Schwarz\/Weiss gewandelt wird. Et voil\u00e1&#8230;<\/p>\n<p>F\u00fcr die interessierten ist hier der Code:<\/p>\n<pre>#! \/usr\/bin\/python\r\n\r\nimport time\r\nimport cv2\r\n\r\ndef diffImg(t0, t1, t2):\r\n    d1 = cv2.absdiff(t2, t1)\r\n    d2 = cv2.absdiff(t1, t0)\r\n    return cv2.bitwise_and(d1, d2)\r\n\r\nprint \"Start Capturing\"\r\ncam = cv2.VideoCapture(0)\r\n\r\n# Threshold for minimum movement\r\nthreshold = 130000\r\ntargetdir = '.\/'\r\nwinName = \"MovementIndicator\"\r\ncv2.namedWindow(winName, cv2.CV_WINDOW_AUTOSIZE)\r\n\r\n# Read three images first:\r\ncolorimg = cam.read()[1]\r\nt_minus = cv2.cvtColor(colorimg, cv2.COLOR_RGB2GRAY)\r\nt = cv2.cvtColor(colorimg, cv2.COLOR_RGB2GRAY)\r\nt_plus = cv2.cvtColor(colorimg, cv2.COLOR_RGB2GRAY)\r\n\r\nstart = time.time()\r\nwhile True:\r\n    dimg=diffImg(t_minus, t, t_plus)\r\n    cv2.imshow( winName, dimg )\r\n\r\n    # save picture, when movement above threshold\r\n    print cv2.countNonZero(dimg)\r\n    if cv2.countNonZero(dimg) > threshold:\r\n        timestamp = round(time.time() - start)\r\n        filename = targetdir + str(timestamp) + \".jpg\"\r\n        cv2.imwrite(filename, colorimg)\r\n\r\n    # Read next image\r\n    colorimg = cam.read()[1]\r\n    t_minus = t\r\n    t = t_plus\r\n    t_plus = cv2.cvtColor(colorimg, cv2.COLOR_RGB2GRAY)\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>F\u00fcr ein kleines Projekt stand gerade vor der Aufgabe, Standbilder per Webcam aufzunehmen und zu speichern &#8211; aber nur, wenn sich etwas vor der Linse bewegt. Das klingt zun\u00e4chst reichlich kompliziert, aber mit den richtigen Werkzeugen ist es tats\u00e4chlich verbl\u00fcffend einfach. Die Werkzeuge der Wahl sind: Python &#8211; Eine popul\u00e4re Skriptsprache OpenCV &#8211; Eine Funktionsbibliothek [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,3],"tags":[],"class_list":["post-2242","post","type-post","status-publish","format-standard","hentry","category-development","category-gizmos"],"_links":{"self":[{"href":"https:\/\/www.ollmetzer.com\/index.php?rest_route=\/wp\/v2\/posts\/2242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ollmetzer.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ollmetzer.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ollmetzer.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ollmetzer.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2242"}],"version-history":[{"count":0,"href":"https:\/\/www.ollmetzer.com\/index.php?rest_route=\/wp\/v2\/posts\/2242\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.ollmetzer.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ollmetzer.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ollmetzer.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}