|
|
|
|
|
|
|
|
|
from pdb import set_trace as bb |
|
import numpy as np |
|
from PIL import Image, ImageOps, ImageEnhance |
|
|
|
|
|
def grab( data, *fields ): |
|
''' Called to extract fields from a dictionary |
|
''' |
|
if isinstance(data, dict): |
|
res = [] |
|
for f in fields: |
|
res.append( data[f] ) |
|
return res[0] if len(fields) == 1 else tuple(res) |
|
|
|
else: |
|
assert fields == ('img',) and isinstance(data, (np.ndarray, Image.Image)), \ |
|
f"data should be an image, not {type(data)}!" |
|
return data |
|
|
|
|
|
def update( data, **fields): |
|
''' Called to update the img_and_label |
|
''' |
|
if isinstance( data, dict): |
|
if 'homography' in fields and 'homography' in data: |
|
data['homography'] = fields.pop('homography') @ data['homography'] |
|
data.update(fields) |
|
if 'img' in fields: |
|
data['imsize'] = data['img'].size |
|
return data |
|
|
|
else: |
|
return fields['img'] |
|
|
|
|
|
def rand_log_uniform(rng, a, b): |
|
return np.exp(rng.uniform(np.log(a),np.log(b))) |
|
|
|
|
|
def translate(tx, ty): |
|
return np.float32(((1,0,tx),(0,1,ty,),(0,0,1))) |
|
|
|
def rotate(angle): |
|
return np.float32(((np.cos(angle),-np.sin(angle),0),(np.sin(angle),np.cos(angle),0),(0,0,1))) |
|
|
|
|
|
def is_pil_image(img): |
|
return isinstance(img, Image.Image) |
|
|
|
|
|
def homography_from_4pts(pts_cur, pts_new): |
|
"pts_cur and pts_new = 4x2 point array, in [(x,y),...] format" |
|
matrix = [] |
|
for p1, p2 in zip(pts_new, pts_cur): |
|
matrix.append([p1[0], p1[1], 1, 0, 0, 0, -p2[0] * p1[0], -p2[0] * p1[1]]) |
|
matrix.append([0, 0, 0, p1[0], p1[1], 1, -p2[1] * p1[0], -p2[1] * p1[1]]) |
|
A = np.matrix(matrix, dtype=np.float) |
|
B = np.array(pts_cur).reshape(8) |
|
|
|
homography = np.dot(np.linalg.pinv(A), B) |
|
homography = tuple(np.array(homography).reshape(8)) |
|
|
|
return homography |
|
|
|
|
|
|
|
|
|
|