In [106]:
import numpy as np
from svgpathtools import svg2paths, Path, Line, wsvg
import svgpathtools
from rdp import rdp
from svg.path import parse_path
import os
import pandas as pd
In [140]:
# define paths
data_dir = './svg'
save_dir = './spline_coords'
start_from = 'cat'
In [141]:
def read_svg_file(filename):
paths, attributes = svg2paths(filename)
return paths
In [143]:
all_classes = sorted([i for i in os.listdir(data_dir) if os.path.isdir(os.path.join(data_dir,i))])
assert len(all_classes)==125
ind = np.where(np.array(all_classes)==start_from)[0][0]
all_classes = all_classes[ind:]
# loop through classes
for c in all_classes:
class_path = os.path.join(path_to_svg,c)
all_sketches = [i for i in os.listdir(class_path) if i.split('.')[1]=='svg']
# initialize
start_x = []
start_y = []
c1_x = []
c1_y = []
c2_x = []
c2_y = []
end_x = []
end_y = []
stroke_num = []
spline_num = []
stroke_counter = 0
spline_counter = 0
class_name = []
photo_name = []
sketch_name = []
path_to_invalid = os.path.join(class_path,'invalid.txt')
with open(path_to_invalid) as f:
invalid = set([line[:-2] for line in f.readlines() if line[0]=='n'])
cat = class_path.split('/')[-1]
# loop through sketches
for i,s in enumerate(all_sketches):
if i%100==0:
print 'Extracted {} of {} {} sketches...'.format(i, len(all_sketches), cat)
if s in invalid:
print s + ' marked invalid, moving on...'
else:
sketch_path = os.path.join(path_to_svg,c,s)
# read in paths and loop through to get strokes and spline segments
try:
paths = read_svg_file(sketch_path)
for path in paths:
stroke_counter += 1
for point in path:
if type(point) == svgpathtools.path.CubicBezier:
start_x.append(np.real(point.start))
start_y.append(np.imag(point.start))
c1_x.append(np.real(point.control1))
c1_y.append(np.imag(point.control1))
c2_x.append(np.real(point.control2))
c2_y.append(np.imag(point.control2))
end_x.append(np.real(point.end))
end_y.append(np.imag(point.end))
spline_num.append(spline_counter)
spline_counter += 1
stroke_num.append(stroke_counter)
class_name.append(os.path.dirname(sketch_path).split('/')[-1])
photo_name.append(os.path.basename(sketch_path).split('-')[0] + '.jpg')
sketch_name.append(os.path.basename(sketch_path))
except:
print 'Issue with ' + sketch_path + '... moving on.'
df = pd.DataFrame([start_x,start_y,c1_x,c1_y,c2_x,c2_y,end_x,end_y, \
stroke_num,spline_num,class_name,photo_name,sketch_name])
df = df.transpose()
df.columns = ['start_x','start_y','c1_x','c1_y','c2_x','c2_y','end_x','end_y', \
'stroke_num','spline_num','class_name','photo_name','sketch_name']
if not os.path.exists(save_dir):
os.makedirs(save_dir)
save_path = os.path.join(save_dir, cat + '.csv')
df.to_csv(save_path)
In [ ]:
In [111]:
In [128]:
In [ ]:
In [ ]: