Add web cam motion detector

This commit is contained in:
Urmi Jana 2022-10-19 00:42:52 +05:30 committed by GitHub
parent 4eda20bccd
commit 2aaf438867
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 154 additions and 0 deletions

View 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>

View 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()