First try at webcam support
parent
a85ea69fb0
commit
e1d541a6e4
|
@ -2,11 +2,12 @@
|
|||
__author__ = "Gina Häußge <osd@foosel.net>"
|
||||
__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
|
||||
|
||||
from flask import Flask, request, render_template, jsonify, make_response
|
||||
from flask import Flask, request, render_template, jsonify, send_from_directory, abort
|
||||
from werkzeug import secure_filename
|
||||
|
||||
from printer_webui.printer import Printer, getConnectionOptions
|
||||
from printer_webui.settings import settings
|
||||
from printer_webui.webcam import hasWebcamSupport, Webcam
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
@ -20,8 +21,16 @@ if not os.path.isdir(UPLOAD_FOLDER):
|
|||
os.makedirs(UPLOAD_FOLDER)
|
||||
ALLOWED_EXTENSIONS = set(["gcode"])
|
||||
|
||||
WEBCAM_FOLDER = os.path.join(settings().settings_dir, "webcam")
|
||||
if not os.path.isdir(WEBCAM_FOLDER):
|
||||
os.makedirs(WEBCAM_FOLDER)
|
||||
|
||||
app = Flask("printer_webui")
|
||||
printer = Printer()
|
||||
if hasWebcamSupport():
|
||||
webcam = Webcam()
|
||||
else:
|
||||
webcam = None
|
||||
|
||||
@app.route("/")
|
||||
def index():
|
||||
|
@ -251,6 +260,17 @@ def setSettings():
|
|||
s.save()
|
||||
return getSettings()
|
||||
|
||||
#~~ webcam
|
||||
|
||||
@app.route(BASEURL + "webcam/image", methods=["GET"])
|
||||
def getImage():
|
||||
if webcam is None:
|
||||
abort(404)
|
||||
|
||||
filename = "current.jpg"
|
||||
webcam.save(os.path.join(WEBCAM_FOLDER, filename))
|
||||
return send_from_directory(WEBCAM_FOLDER, filename)
|
||||
|
||||
#~~ helper functions
|
||||
|
||||
def sizeof_fmt(num):
|
||||
|
|
|
@ -93,3 +93,16 @@ table th.gcode_files_action, table td.gcode_files_action {
|
|||
#offline_overlay_wrapper .container {
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
#webcam_container {
|
||||
height: 440px;
|
||||
background-color: #000000;
|
||||
}
|
||||
|
||||
#webcam_placeholder {
|
||||
height: 440px;
|
||||
line-height: 440px;
|
||||
text-align: center;
|
||||
color: #ffffff;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
//~~ View models
|
||||
|
||||
function ConnectionViewModel() {
|
||||
var self = this;
|
||||
|
||||
|
@ -436,6 +438,32 @@ function DataUpdater(connectionViewModel, printerStateViewModel, temperatureView
|
|||
}
|
||||
var dataUpdater = new DataUpdater(connectionViewModel, printerStateViewModel, temperatureViewModel, speedViewModel, terminalViewModel);
|
||||
|
||||
function WebcamViewModel() {
|
||||
var self = this;
|
||||
|
||||
self.webcamUpdateInterval = 5000;
|
||||
self.offlineUrl = "/static/img/webcam-offline.png";
|
||||
|
||||
self.url = ko.observable(undefined);
|
||||
self.enabled = ko.observable(undefined);
|
||||
|
||||
self.enabled.subscribe(function(newValue) {
|
||||
if (newValue) {
|
||||
self.requestData();
|
||||
} else {
|
||||
$("#webcam_image")
|
||||
}
|
||||
});
|
||||
|
||||
self.requestData = function() {
|
||||
if (!self.enabled())
|
||||
return;
|
||||
self.url(AJAX_BASEURL + "webcam/image?" + (new Date()).getTime());
|
||||
setTimeout(self.requestData, self.webcamUpdateInterval);
|
||||
}
|
||||
}
|
||||
var webcamViewModel = new WebcamViewModel();
|
||||
|
||||
$(function() {
|
||||
|
||||
//~~ Print job control
|
||||
|
@ -575,6 +603,7 @@ $(function() {
|
|||
ko.applyBindings(printerStateViewModel, document.getElementById("jog"));
|
||||
ko.applyBindings(terminalViewModel, document.getElementById("term"));
|
||||
ko.applyBindings(speedViewModel, document.getElementById("speed"));
|
||||
ko.applyBindings(webcamViewModel, document.getElementById("webcam"));
|
||||
|
||||
//~~ startup commands
|
||||
|
||||
|
|
|
@ -217,7 +217,13 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="tab-pane" id="webcam">
|
||||
Here be webcam stuff
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" id="webcam_enable" data-bind="checked: enabled"> Enable webcam
|
||||
</label>
|
||||
<div id="webcam_container">
|
||||
<img id="webcam_image" data-bind="attr: { src: url }, visible: enabled()">
|
||||
<div id="webcam_placeholder" data-bind="visible: !enabled()">Offline</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
# coding=utf-8
|
||||
__author__ = "Gina Häußge <osd@foosel.net>"
|
||||
__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
|
||||
|
||||
try:
|
||||
#Try to find the OpenCV library for video capture.
|
||||
from opencv import cv
|
||||
from opencv import highgui
|
||||
except:
|
||||
cv = None
|
||||
|
||||
try:
|
||||
import VideoCapture as win32vidcap
|
||||
except:
|
||||
win32vidcap = None
|
||||
|
||||
def hasWebcamSupport():
|
||||
if cv == None and win32vidcap == None:
|
||||
return False
|
||||
return True
|
||||
|
||||
class Webcam(object):
|
||||
def __init__(self):
|
||||
self._cam = None
|
||||
if cv != None:
|
||||
self._cam = highgui.cvCreateCameraCapture(-1)
|
||||
elif win32vidcap != None:
|
||||
try:
|
||||
self._cam = win32vidcap.Device()
|
||||
self._cam.setResolution(640, 480)
|
||||
except:
|
||||
pass
|
||||
|
||||
def save(self, filename):
|
||||
if self._cam is None:
|
||||
return
|
||||
|
||||
if cv is not None:
|
||||
frame = cv.QueryFrame(self._cam)
|
||||
cv.SaveImage(filename, frame)
|
||||
elif win32vidcap is not None:
|
||||
self._cam.saveSnapshot(filename)
|
||||
|
||||
if __name__ == "__main__":
|
||||
from printer_webui.settings import settings
|
||||
import os
|
||||
|
||||
webcam = Webcam()
|
||||
webcam.save(os.path.join(settings().settings_dir, "image.png"))
|
Loading…
Reference in New Issue