[enh] Fist working version
This commit is contained in:
parent
40d8250ec5
commit
fd0974134b
37
canvas.js
37
canvas.js
@ -1,10 +1,8 @@
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
console.log("ok")
|
||||
|
||||
var binary_level = 100
|
||||
|
||||
var url = "http://localhost"
|
||||
|
||||
// Grab elements, create settings, etc.
|
||||
var canvas = document.getElementById('canvas');
|
||||
@ -19,6 +17,7 @@ console.log("ok")
|
||||
context.drawImage(video, 0, 0, 640, 480);
|
||||
binary(context)
|
||||
$("#result").show()
|
||||
$('html, body').animate({scrollTop: $("#result").offset().top}, 2000);
|
||||
}
|
||||
|
||||
|
||||
@ -62,7 +61,7 @@ console.log("ok")
|
||||
}
|
||||
|
||||
// Trigger photo take
|
||||
document.getElementById('snap').addEventListener('click', function() {
|
||||
$('.snap').on('click', function() {
|
||||
snap()
|
||||
});
|
||||
function binary(context){
|
||||
@ -77,7 +76,6 @@ console.log("ok")
|
||||
var thresh_red = binary_level;
|
||||
var thresh_green = binary_level;
|
||||
var thresh_blue = binary_level;
|
||||
console.log( binary_level )
|
||||
|
||||
var channels = image.data.length/4;
|
||||
for(var i=0;i<channels;i++){
|
||||
@ -110,6 +108,33 @@ console.log("ok")
|
||||
}
|
||||
});
|
||||
$("#send").on("click",function(){
|
||||
alert("Sorry, this is still a work in progress ¯\_(ツ)_/¯")
|
||||
var canvas = document.getElementById('canvas');
|
||||
image_data = canvas.toDataURL();
|
||||
$("#messages").html('<div class="alert alert-primary" role="alert">Sending...</div>')
|
||||
|
||||
$.ajax({
|
||||
url: url + "/image",
|
||||
method:"POST",
|
||||
dataType: "json",
|
||||
data:{
|
||||
image_data : image_data,
|
||||
text : $("#text").val()
|
||||
},
|
||||
|
||||
}).done(function(d,m,j){
|
||||
if( d.errors ){
|
||||
msg = d.errors.join(" / ")
|
||||
$("#messages").html(`<div class="alert alert-danger" role="alert">Something went wrong: ${msg}</div>`)
|
||||
return
|
||||
}
|
||||
$("#messages").html(`<div class="alert alert-success" role="alert">OK, your image will be on ${d.hash_name}</div>`)
|
||||
imageList = localStorage.getItem("imageList") ? JSON.parse(localStorage.getItem("imageList")) : []
|
||||
imageList.push(d.hash_name)
|
||||
localStorage.setItem("imageList",JSON.stringify(imageList))
|
||||
})
|
||||
.fail(function(d,m,jq){
|
||||
$("#messages").html(`<div class="alert alert-danger" role="alert">Ooops... Something went wrong: ${jq}</div>`)
|
||||
|
||||
})
|
||||
})
|
||||
})
|
||||
|
@ -36,7 +36,7 @@ window.ORIGINAL_JSON=window.JSON;
|
||||
<video id="video" autoplay></video>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<button id="snap" class="btn btn-lg btn-primary">Take a picture!</button>
|
||||
<button class="snap btn btn-lg btn-primary">Take a picture!</button>
|
||||
<p class="lead">By allowing the use of your camera, you will be able to take snapshots, convert them to black and white images before sending them to the laser server. How cool is that?!</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -45,7 +45,7 @@ window.ORIGINAL_JSON=window.JSON;
|
||||
<canvas id="canvas" width="640" height="480"></canvas>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<h3 class="btn btn-lg btn-primary">Not satisfied of the contrast? </h3>
|
||||
<h3 class="snap btn btn-lg btn-primary">Not satisfied of the contrast? </h3>
|
||||
<br/>
|
||||
<div id="slider"></div>
|
||||
<br/>
|
||||
@ -56,9 +56,12 @@ window.ORIGINAL_JSON=window.JSON;
|
||||
<h3>Satisfied? </h3>
|
||||
<p class="lead">Type the text visible on your image (if any) and push Send.</p>
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control form-control-lg" placeholder="Type text here"/>
|
||||
<input id="text" type="text" class="form-control form-control-lg" placeholder="Type text here"/>
|
||||
<button id="send" class="form-control form-control-lg btn btn-lg btn-warning btn-block">Send</button>
|
||||
</div>
|
||||
|
||||
<div id="messages">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
72
manage.py
Normal file
72
manage.py
Normal file
@ -0,0 +1,72 @@
|
||||
#! /usr/bin/python3
|
||||
from datetime import datetime
|
||||
from redis import Redis
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
modeList = {
|
||||
"list" : ["l","list"],
|
||||
"delete" : ["d","delete"],
|
||||
"exit" : ["x","q","exit"],
|
||||
"preview" : ["p","preview"],
|
||||
}
|
||||
|
||||
argsparser = argparse.ArgumentParser(description="manager")
|
||||
argsparser.add_argument("-m","--mode",help="The action to perform. One of : {}".format(", ".join(modeList.keys())),default="list",type=str)
|
||||
argsparser.add_argument("-P","--path",help="clitools path",default="~/code/lj-nano/clitools",type=str)
|
||||
argsparser.add_argument("-i","--ip",help="IP address of the Redis server ",default="127.0.0.1",type=str)
|
||||
argsparser.add_argument("-p","--port",help="Port of the Redis server ",default="6379",type=str)
|
||||
args = argsparser.parse_args()
|
||||
mode = args.mode
|
||||
clipath = args.path
|
||||
port = args.port
|
||||
ip = args.ip
|
||||
|
||||
r = Redis(host=ip, port=port)
|
||||
|
||||
hashList = []
|
||||
|
||||
def refreshList():
|
||||
global hashList
|
||||
hashList = {}
|
||||
theList = r.hgetall("images")
|
||||
for i in theList:
|
||||
item = json.loads(theList[i])
|
||||
theList[i] = item
|
||||
|
||||
# Sort by reverse Date
|
||||
for i in sorted(theList.items(),key=lambda x: x[1]['created_at'],reverse=True):
|
||||
hashList[i[0].decode("ascii")] = i[1]
|
||||
|
||||
|
||||
while True:
|
||||
refreshList()
|
||||
if mode in modeList["list"] :
|
||||
print("hash\t\t\tdate\t\t\tpoints info")
|
||||
for i in hashList:
|
||||
item = hashList[i]
|
||||
pl = item["points_list"]
|
||||
created_at = item["created_at"]
|
||||
print("{}\t{}\t{} points".format(i,datetime.ctime(datetime.fromtimestamp(created_at)),len(pl)))
|
||||
|
||||
elif mode in modeList["delete"]:
|
||||
print("Select a hash to delete")
|
||||
hash_name = input()
|
||||
result = r.hdel("images",hash_name)
|
||||
print("Result: {}".format(result))
|
||||
|
||||
elif mode in modeList["preview"]:
|
||||
print("Select a hash to preview")
|
||||
hash_name = input()
|
||||
item = json.loads(hashList[bytes(hash_name,'ascii')])
|
||||
points_list = json.dumps(item["points_list"])
|
||||
bashCommand = "while true; do echo '"+points_list+"'; sleep 0.5; done | /usr/bin/python3 "+clipath+"/exports/tosimu.py"
|
||||
os.system(bashCommand)
|
||||
|
||||
elif mode in modeList["exit"]:
|
||||
break
|
||||
|
||||
print("Next action? (l)ist (d)elete e(x)it (p)review")
|
||||
mode = input()
|
49
post.py
Normal file
49
post.py
Normal file
@ -0,0 +1,49 @@
|
||||
#! /usr/bin/python3
|
||||
import flask
|
||||
from redis import Redis
|
||||
from flask import Flask, redirect, url_for, request
|
||||
import json
|
||||
import hashlib
|
||||
import time
|
||||
|
||||
r = Redis()
|
||||
app = Flask(__name__)
|
||||
m = hashlib.sha256()
|
||||
@app.route('/dashboard/<name>')
|
||||
def dashboard(name):
|
||||
return 'welcome %s' % name
|
||||
|
||||
@app.route('/image',methods = ['POST', 'GET'])
|
||||
def image():
|
||||
try:
|
||||
data = dict()
|
||||
|
||||
# Clean the request
|
||||
if "text" in request.form:
|
||||
data["text"] = request.form["text"][:256]
|
||||
else :
|
||||
data["text"] = ""
|
||||
|
||||
if "image_data" in request.form:
|
||||
data["image_data"] = request.form["image_data"]
|
||||
else:
|
||||
raise Exception("image_data is mandatory")
|
||||
|
||||
m.update( bytes(time.asctime(), 'utf-8'))
|
||||
hash_name = m.hexdigest()[:16]
|
||||
data["hash_name"] = hash_name
|
||||
|
||||
# Save to queue
|
||||
r.rpush("image-convert",json.dumps(data))
|
||||
return( json.dumps({
|
||||
"message":"ok",
|
||||
"hash_name":hash_name
|
||||
}) )
|
||||
|
||||
except Exception as e:
|
||||
print("woah",e)
|
||||
return( json.dumps( {"errors":[ str(e)]}))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug = True)
|
64
worker.py
Normal file
64
worker.py
Normal file
@ -0,0 +1,64 @@
|
||||
#! /usr/bin/python3
|
||||
from io import BytesIO
|
||||
from numpy import asarray
|
||||
from PIL import Image
|
||||
from redis import Redis
|
||||
import base64
|
||||
import json
|
||||
import potrace
|
||||
import re
|
||||
import time
|
||||
|
||||
color = 65280
|
||||
r = Redis()
|
||||
|
||||
def convertImg(src, image_path="/tmp/"):
|
||||
base64_data = re.sub('^data:image/.+;base64,', '', src)
|
||||
byte_data = base64.b64decode(base64_data)
|
||||
image_data = BytesIO(byte_data)
|
||||
img = Image.open(image_data).convert("1")
|
||||
return img
|
||||
|
||||
# Read results from redis
|
||||
data = r.lpop('image-convert')
|
||||
while data :
|
||||
try:
|
||||
item = json.loads(data)
|
||||
image_data = item["image_data"]
|
||||
text = item["text"]
|
||||
hash_name = item["hash_name"]
|
||||
|
||||
# Vectorize the image
|
||||
image = convertImg( image_data )
|
||||
bmp = potrace.Bitmap( asarray( image ) )
|
||||
|
||||
# Trace the bitmap to a path
|
||||
path = bmp.trace(turdsize=16,alphamax=0.0, opticurve=0, opttolerance=1.0)
|
||||
pl = []
|
||||
|
||||
for curve in path:
|
||||
start = curve.start_point
|
||||
pl.append([int(start[0]),int(start[1]),0])
|
||||
pl.append([int(start[0]),int(start[1]),color])
|
||||
for segment in curve:
|
||||
end_point_x, end_point_y = segment.end_point
|
||||
if segment.is_corner:
|
||||
c_x, c_y = segment.c
|
||||
pl.append([int(c_x),int(c_y),color])
|
||||
pass
|
||||
#
|
||||
else:
|
||||
c1_x, c1_y = segment.c1
|
||||
x, y = segment.c2
|
||||
pl.append([int(x),int(y),color])
|
||||
pl.append([int(c1_x),int(c1_y),color])
|
||||
#
|
||||
pl.append([start[0],start[1],0])
|
||||
item["points_list"] = pl
|
||||
item["created_at"] = time.time()
|
||||
r.hset("images",hash_name, json.dumps(item))
|
||||
data = r.lpop('image-convert')
|
||||
|
||||
except Exception as e:
|
||||
print("woops",e)
|
||||
break
|
Loading…
Reference in New Issue
Block a user