mirror of
https://github.com/metafy-social/python-scripts.git
synced 2025-02-28 10:58:42 +00:00
Add web cam motion detector
This commit is contained in:
parent
4eda20bccd
commit
2aaf438867
85
scripts/WebCam Motion Detector/Graph.html
Normal file
85
scripts/WebCam Motion Detector/Graph.html
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Bokeh Plot</title>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-2.3.1.min.js" integrity="sha384-YF85VygJKMVnHE+lLv2AM93Vbstr0yo2TbIu5v8se5Rq3UQAUmcuh4aaJwNlpKwa" crossorigin="anonymous"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
Bokeh.set_log_level("info");
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="bk-root" id="eb4b3ef5-8cf1-4f01-b94d-8609433fea5d" data-root-id="1002"></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script type="application/json" id="1263">
|
||||||
|
{"e3880aee-fea0-4f54-b28d-0163e9e0386b":{"defs":[],"roots":{"references":[{"attributes":{"data":{"left":{"__ndarray__":"qIAarBOPd0IINmCtE493Qg==","dtype":"float64","order":"little","shape":[2]},"right":{"__ndarray__":"qCBdrROPd0JYc6WtE493Qg==","dtype":"float64","order":"little","shape":[2]}},"selected":{"id":"1050"},"selection_policy":{"id":"1051"}},"id":"1038","type":"ColumnDataSource"},{"attributes":{},"id":"1051","type":"UnionRenderers"},{"attributes":{"months":[0,6]},"id":"1062","type":"MonthsTicker"},{"attributes":{},"id":"1063","type":"YearsTicker"},{"attributes":{"formatter":{"id":"1047"},"major_label_policy":{"id":"1048"},"ticker":{"id":"1014"}},"id":"1013","type":"DatetimeAxis"},{"attributes":{"num_minor_ticks":5,"tickers":[{"id":"1052"},{"id":"1053"},{"id":"1054"},{"id":"1055"},{"id":"1056"},{"id":"1057"},{"id":"1058"},{"id":"1059"},{"id":"1060"},{"id":"1061"},{"id":"1062"},{"id":"1063"}]},"id":"1014","type":"DatetimeTicker"},{"attributes":{},"id":"1011","type":"LinearScale"},{"attributes":{},"id":"1009","type":"LinearScale"},{"attributes":{},"id":"1044","type":"BasicTickFormatter"},{"attributes":{},"id":"1045","type":"AllLabels"},{"attributes":{"active_multi":null,"tools":[{"id":"1021"},{"id":"1022"},{"id":"1023"},{"id":"1024"},{"id":"1025"},{"id":"1026"},{"id":"1036"}]},"id":"1028","type":"Toolbar"},{"attributes":{"axis":{"id":"1013"},"ticker":null},"id":"1016","type":"Grid"},{"attributes":{"bottom_units":"screen","fill_alpha":0.5,"fill_color":"lightgrey","left_units":"screen","level":"overlay","line_alpha":1.0,"line_color":"black","line_dash":[4,4],"line_width":2,"right_units":"screen","syncable":false,"top_units":"screen"},"id":"1027","type":"BoxAnnotation"},{"attributes":{},"id":"1026","type":"HelpTool"},{"attributes":{"text":"Motion Graph"},"id":"1003","type":"Title"},{"attributes":{"formatter":{"id":"1044"},"major_label_policy":{"id":"1045"},"minor_tick_line_color":null,"ticker":{"id":"1018"}},"id":"1017","type":"LinearAxis"},{"attributes":{"axis":{"id":"1017"},"dimension":1,"ticker":null},"id":"1020","type":"Grid"},{"attributes":{"desired_num_ticks":1},"id":"1018","type":"BasicTicker"},{"attributes":{},"id":"1047","type":"DatetimeTickFormatter"},{"attributes":{},"id":"1007","type":"DataRange1d"},{"attributes":{},"id":"1022","type":"WheelZoomTool"},{"attributes":{},"id":"1048","type":"AllLabels"},{"attributes":{},"id":"1021","type":"PanTool"},{"attributes":{"overlay":{"id":"1027"}},"id":"1023","type":"BoxZoomTool"},{"attributes":{"below":[{"id":"1013"}],"center":[{"id":"1016"},{"id":"1020"}],"height":500,"left":[{"id":"1017"}],"renderers":[{"id":"1041"}],"title":{"id":"1003"},"toolbar":{"id":"1028"},"width":500,"x_range":{"id":"1005"},"x_scale":{"id":"1009"},"y_range":{"id":"1007"},"y_scale":{"id":"1011"}},"id":"1002","subtype":"Figure","type":"Plot"},{"attributes":{},"id":"1024","type":"SaveTool"},{"attributes":{},"id":"1025","type":"ResetTool"},{"attributes":{"bottom":{"value":0},"fill_alpha":{"value":0.1},"fill_color":{"value":"purple"},"left":{"field":"left"},"line_alpha":{"value":0.1},"line_color":{"value":"purple"},"right":{"field":"right"},"top":{"value":1}},"id":"1040","type":"Quad"},{"attributes":{"data_source":{"id":"1038"},"glyph":{"id":"1039"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"1040"},"view":{"id":"1042"}},"id":"1041","type":"GlyphRenderer"},{"attributes":{"mantissas":[1,2,5],"max_interval":500.0,"num_minor_ticks":0},"id":"1052","type":"AdaptiveTicker"},{"attributes":{"bottom":{"value":0},"fill_color":{"value":"purple"},"left":{"field":"left"},"line_color":{"value":"purple"},"right":{"field":"right"},"top":{"value":1}},"id":"1039","type":"Quad"},{"attributes":{"base":60,"mantissas":[1,2,5,10,15,20,30],"max_interval":1800000.0,"min_interval":1000.0,"num_minor_ticks":0},"id":"1053","type":"AdaptiveTicker"},{"attributes":{"months":[0,4,8]},"id":"1061","type":"MonthsTicker"},{"attributes":{},"id":"1005","type":"DataRange1d"},{"attributes":{"base":24,"mantissas":[1,2,4,6,8,12],"max_interval":43200000.0,"min_interval":3600000.0,"num_minor_ticks":0},"id":"1054","type":"AdaptiveTicker"},{"attributes":{"months":[0,1,2,3,4,5,6,7,8,9,10,11]},"id":"1059","type":"MonthsTicker"},{"attributes":{"days":[1,15]},"id":"1058","type":"DaysTicker"},{"attributes":{"days":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},"id":"1055","type":"DaysTicker"},{"attributes":{"days":[1,4,7,10,13,16,19,22,25,28]},"id":"1056","type":"DaysTicker"},{"attributes":{"source":{"id":"1038"}},"id":"1042","type":"CDSView"},{"attributes":{},"id":"1050","type":"Selection"},{"attributes":{"months":[0,2,4,6,8,10]},"id":"1060","type":"MonthsTicker"},{"attributes":{"days":[1,8,15,22]},"id":"1057","type":"DaysTicker"},{"attributes":{"callback":null,"tooltips":[["Start:","@Start"],["End","@End"]]},"id":"1036","type":"HoverTool"}],"root_ids":["1002"]},"title":"Bokeh Application","version":"2.3.1"}}
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
(function() {
|
||||||
|
var fn = function() {
|
||||||
|
Bokeh.safely(function() {
|
||||||
|
(function(root) {
|
||||||
|
function embed_document(root) {
|
||||||
|
|
||||||
|
var docs_json = document.getElementById('1263').textContent;
|
||||||
|
var render_items = [{"docid":"e3880aee-fea0-4f54-b28d-0163e9e0386b","root_ids":["1002"],"roots":{"1002":"eb4b3ef5-8cf1-4f01-b94d-8609433fea5d"}}];
|
||||||
|
root.Bokeh.embed.embed_items(docs_json, render_items);
|
||||||
|
|
||||||
|
}
|
||||||
|
if (root.Bokeh !== undefined) {
|
||||||
|
embed_document(root);
|
||||||
|
} else {
|
||||||
|
var attempts = 0;
|
||||||
|
var timer = setInterval(function(root) {
|
||||||
|
if (root.Bokeh !== undefined) {
|
||||||
|
clearInterval(timer);
|
||||||
|
embed_document(root);
|
||||||
|
} else {
|
||||||
|
attempts++;
|
||||||
|
if (attempts > 100) {
|
||||||
|
clearInterval(timer);
|
||||||
|
console.log("Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 10, root)
|
||||||
|
}
|
||||||
|
})(window);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
if (document.readyState != "loading") fn();
|
||||||
|
else document.addEventListener("DOMContentLoaded", fn);
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
69
scripts/WebCam Motion Detector/MotionDetector.py
Normal file
69
scripts/WebCam Motion Detector/MotionDetector.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import cv2,time,pandas
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
first_frame = None
|
||||||
|
status_list = [None, None]
|
||||||
|
time = []
|
||||||
|
df = pandas.DataFrame(columns=["Start", "End"])
|
||||||
|
|
||||||
|
video = cv2.VideoCapture(0)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
check, frame = video.read()
|
||||||
|
status = 0
|
||||||
|
grey = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
|
||||||
|
grey = cv2.GaussianBlur(grey, (21, 21), 0) #blurring for accuracy
|
||||||
|
|
||||||
|
if first_frame is None: #capturing the background or the initial frame
|
||||||
|
first_frame = grey
|
||||||
|
continue
|
||||||
|
|
||||||
|
delta_frame = cv2.absdiff(first_frame, grey) #to
|
||||||
|
|
||||||
|
thresh_frame = cv2.threshold(delta_frame, 30, 255, cv2.THRESH_BINARY)[1]
|
||||||
|
#returns a tuple and converts the moving pixels to white
|
||||||
|
|
||||||
|
thresh_frame = cv2.dilate(thresh_frame, None, iterations=2)
|
||||||
|
|
||||||
|
(cnts,_) = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL,
|
||||||
|
cv2.CHAIN_APPROX_SIMPLE)
|
||||||
|
|
||||||
|
for cont in cnts:
|
||||||
|
if cv2.contourArea(cont) < 10000: #excluding negligble objects
|
||||||
|
continue
|
||||||
|
status = 1
|
||||||
|
(x, y, w, h) = cv2.boundingRect(cont)
|
||||||
|
cv2.rectangle(frame, (x, y), (x+w, y+h), (0,255,0), 3,)
|
||||||
|
status_list.append(status)
|
||||||
|
|
||||||
|
status_list = status_list[-2:]
|
||||||
|
|
||||||
|
if status_list[-1] == 1 and status_list[-2] == 0:
|
||||||
|
time.append(datetime.now())
|
||||||
|
if status_list[-1] == 0 and status_list[-2] == 1:
|
||||||
|
time.append(datetime.now())
|
||||||
|
cv2.imshow("captured", grey)
|
||||||
|
cv2.imshow("delta", delta_frame)
|
||||||
|
cv2.imshow("Threshold", thresh_frame)
|
||||||
|
cv2.imshow("color frame", frame)
|
||||||
|
|
||||||
|
key = cv2.waitKey(1)
|
||||||
|
|
||||||
|
if key == ord('q'):
|
||||||
|
if status == 1:
|
||||||
|
time.append(datetime.now())
|
||||||
|
break
|
||||||
|
print(status)
|
||||||
|
|
||||||
|
print(status_list)
|
||||||
|
print(time)
|
||||||
|
|
||||||
|
for i in range(0, len(time), 2):
|
||||||
|
df = df.append({"Start" : time[i], "End": time[i+1]}, ignore_index=True)
|
||||||
|
|
||||||
|
df.to_csv("Times.csv")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
video.release()
|
||||||
|
cv2.destroyAllWindows()
|
Loading…
x
Reference in New Issue
Block a user