Files @ 5f42b982809c
Branch filter:

Location: OneEye/exp/annotations.py

Laman
deferred data preprocessing saving space
import sys
sys.path.append("../src")

import gzip
import json
from typing import MutableMapping

from analyzer.epoint import EPoint
from analyzer.corners import Corners


class Board:
	def __init__(self,**kwargs):
		self.board=Corners(kwargs.get("board") or [])
		self.grid=Corners(kwargs.get("grid") or [])

	def isEmpty(self):
		return len(self.board)==0 and len(self.grid)==0


class DataFile(MutableMapping):
	"""self.data: {filename: [Board, ...}"""
	def __init__(self,filename):
		self.filename=filename
		try:
			with gzip.open(filename,mode="rt",encoding="utf8") as f:
				self._data=json.load(f,object_hook=self.deserialize)
		except OSError:
			self._data=dict()

	def save(self):
		with gzip.open(self.filename,mode="wt",encoding="utf8") as f:
			json.dump(self._data,f,default=self.serialize,indent="\t")

	def serialize(self,obj):
		if isinstance(obj,EPoint):
			return {"type": "EPoint", "val": [obj.x,obj.y]}
		elif isinstance(obj,Board):
			return {"type": "Board", "val": {"board": list(obj.board), "grid": list(obj.grid)}}
		raise TypeError(obj)

	def deserialize(self,obj):
		type=obj.get("type")
		if type=="EPoint": return EPoint(*obj["val"])
		elif type=="Board": return Board(**obj["val"])
		return obj

	def __getitem__(self, key): return self._data[key]
	def __setitem__(self, key, val): self._data[key]=val
	def __delitem__(self, key): del self._data[key]
	def __iter__(self): return iter(self._data)
	def __len__(self): return len(self._data)


def computeBoundingBox(corners):
	x1=min(p.x for p in corners)
	x2=max(p.x for p in corners)
	y1=min(p.y for p in corners)
	y2=max(p.y for p in corners)
	return (x1,y1,x2,y2)