Mercurial > code > home > repos > light9
changeset 1585:17da56a3c8df
group device captures into sessions, limit solver to specific ones
Ignore-this: b91d858ebb435973b9742bed00567ffd
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Tue, 30 May 2017 08:37:25 +0000 |
parents | 2239d5648932 |
children | 901767febb47 |
files | bin/captureDevice bin/paintserver light9/paint/capture.py light9/paint/solve.py |
diffstat | 4 files changed, 38 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/bin/captureDevice Tue May 30 07:57:52 2017 +0000 +++ b/bin/captureDevice Tue May 30 08:37:25 2017 +0000 @@ -15,25 +15,25 @@ from run_local import log from lib.cycloneerr import PrettyErrorHandler -from light9.namespaces import L9 +from light9.namespaces import L9, RDF from light9 import networking, showconfig from light9.rdfdb.syncedgraph import SyncedGraph from light9.paint.capture import writeCaptureDescription from light9.greplin_cyclone import StatsForCyclone from light9.effect.settings import DeviceSettings from light9.effect.sequencer import sendToCollector +from light9.rdfdb.patch import Patch stats = scales.collection('/webServer', scales.PmfStat('setAttr')) - class Camera(object): def __init__(self, imageUrl): self.imageUrl = imageUrl def takePic(self, uri, writePath): log.info('takePic %s', uri) - return treq.get(self.imageUrl).addCallbacks(lambda r: self._done(writePath, r), - log.error) + return treq.get(self.imageUrl).addCallbacks( + lambda r: self._done(writePath, r), log.error) @inlineCallbacks def _done(self, writePath, response): @@ -56,6 +56,7 @@ settleTime = .5 def __init__(self, graph, dev): self.graph = graph + self.dev = dev def steps(a, b, n): return [round(a + (b - a) * i / n, 5) for i in range(n)] @@ -77,6 +78,15 @@ (dev, L9['color'], '#ffffff'), ])) + self.devTail = dev.rsplit('/')[-1] + self.session = URIRef('/'.join([showconfig.showUri(), + 'capture', self.devTail, self.captureId])) + self.ctx = URIRef(self.session + '/index') + + self.graph.patch(Patch(addQuads=[ + (self.session, RDF.type, L9['CaptureSession'], self.ctx), + ])) + self.numPics = 0 self.settingsCache = set() self.step().addErrback(log.error) @@ -101,20 +111,17 @@ yield deferSleep(self.firstMoveTime if self.numPics == 0 else self.settleTime) - dev = settings.devices()[0] - devTail = dev.rsplit('/')[-1] picId = 'pic%s' % self.numPics - path = '/'.join(['capture', devTail, self.captureId, picId]) + '.jpg' - ctx = URIRef('/'.join([showconfig.showUri(), - 'capture', devTail, self.captureId, 'index'])) - uri = URIRef('/'.join([showconfig.showUri(), - 'capture', devTail, self.captureId, picId])) + path = '/'.join([ + 'capture', self.devTail, self.captureId, picId]) + '.jpg' + uri = URIRef(self.session + '/' + picId) yield camera.takePic(uri, os.path.join(showconfig.root(), path)) self.numPics += 1 - writeCaptureDescription(self.graph, ctx, uri, dev, path, - self.settingsCache, settings) + writeCaptureDescription(self.graph, self.ctx, self.session, uri, + self.dev, + path, self.settingsCache, settings) reactor.callLater(0, self.step)
--- a/bin/paintserver Tue May 30 07:57:52 2017 +0000 +++ b/bin/paintserver Tue May 30 08:37:25 2017 +0000 @@ -53,7 +53,7 @@ def launch(self, *args): - self.solver = light9.paint.solve.Solver(self.graph) + self.solver = light9.paint.solve.Solver(self.graph, sessions=[L9['show/dance2017/capture/moving1/cap961804']]) self.solver.loadSamples() self.cycloneApp = cyclone.web.Application(handlers=[
--- a/light9/paint/capture.py Tue May 30 07:57:52 2017 +0000 +++ b/light9/paint/capture.py Tue May 30 08:37:25 2017 +0000 @@ -5,8 +5,8 @@ from light9.namespaces import L9, RDF from light9.paint.solve import loadNumpy -def writeCaptureDescription(graph, ctx, uri, dev, outPath, settingsSubgraphCache, - settings): +def writeCaptureDescription(graph, ctx, session, uri, dev, outPath, + settingsSubgraphCache, settings): graph.patch(Patch(addQuads=settings.statements( uri, ctx=ctx, settingRoot=URIRef('/'.join([ @@ -14,6 +14,7 @@ settingsSubgraphCache=settingsSubgraphCache))) graph.patch(Patch(addQuads=[ (dev, L9['capture'], uri, ctx), + (session, L9['capture'], uri, ctx), (uri, RDF.type, L9['LightSample'], ctx), (uri, L9['imagePath'], URIRef('/'.join([ showconfig.showUri(), outPath])), ctx),
--- a/light9/paint/solve.py Tue May 30 07:57:52 2017 +0000 +++ b/light9/paint/solve.py Tue May 30 08:37:25 2017 +0000 @@ -67,8 +67,9 @@ class Solver(object): - def __init__(self, graph, imgSize=(100, 75)): + def __init__(self, graph, sessions=None, imgSize=(100, 75)): self.graph = graph + self.sessions = sessions self.imgSize = imgSize self.samples = {} # uri: Image array (float 0-255) self.fromPath = {} # imagePath: image array @@ -79,15 +80,19 @@ """learn what lights do from images""" with self.graph.currentState() as g: - for samp in g.subjects(RDF.type, L9['LightSample']): - pathUri = g.value(samp, L9['imagePath']) - self.samples[samp] = self.fromPath[pathUri] = loadNumpy(pathUri.replace(L9[''], '')).astype(float) - self.blurredSamples[samp] = self._blur(self.samples[samp]) - - key = (samp, pathUri) - self.sampleSettings[key] = DeviceSettings.fromResource(self.graph, samp) + for sess in self.sessions: + for cap in g.objects(sess, L9['capture']): + self._loadSample(g, cap) log.info('loaded %s samples', len(self.samples)) - + + def _loadSample(self, g, samp): + pathUri = g.value(samp, L9['imagePath']) + self.samples[samp] = self.fromPath[pathUri] = loadNumpy(pathUri.replace(L9[''], '')).astype(float) + self.blurredSamples[samp] = self._blur(self.samples[samp]) + + key = (samp, pathUri) + self.sampleSettings[key] = DeviceSettings.fromResource(self.graph, samp) + def _blur(self, img): return scipy.ndimage.gaussian_filter(img, 10, 0, mode='nearest')