Open Source Computer Vision Library https://opencv.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

81 lines
3.1 KiB

#!/usr/bin/env python
import sys, os, os.path, glob, math, cv2, string, random
from datetime import datetime
from optparse import OptionParser
import re
import numpy as np
from xml.dom import minidom
def resize(image, d_w, d_h):
if (d_h < image.shape[0]) or (d_w < image.shape[1]):
ratio = min(d_h / float(image.shape[0]), d_w / float(image.shape[1]))
kernel_size = int( 5 / (2 * ratio))
sigma = 0.5 / ratio
image_to_resize = cv2.filter2D(image, cv2.CV_8UC3, cv2.getGaussianKernel(kernel_size, sigma))
interpolation_type = cv2.INTER_AREA
else:
image_to_resize = image
interpolation_type = cv2.INTER_CUBIC
return cv2.resize(image_to_resize,(d_w, d_h), None, 0, 0, interpolation_type)
def det2negative(xmldoc, opath):
samples = xmldoc.getElementsByTagName('sample')
for sample in samples:
detections = sample.getElementsByTagName('detections')
detections = minidom.parseString(detections[0].toxml())
detections = detections.getElementsByTagName("_")
if len(detections) is not 0:
path = sample.getElementsByTagName("path")
path = path[0].firstChild.nodeValue
mat = cv2.imread(path)
mat_h, mat_w, _ = mat.shape
for detection in detections:
detection = detection.childNodes
for each in detection:
rect = eval(re.sub( r"\b\s\b", ",", re.sub(r"\n", "[", each.nodeValue )) + "]")
print rect
ratio = 64.0 / rect[3]
print rect, ratio
mat = resize(mat, int(round(mat_w * ratio)), int(round(mat_h * ratio)))
rect[0] = int(round(ratio * rect[0])) - 10
rect[1] = int(round(ratio * rect[1])) - 10
rect[2] = rect[0] + 32 + 20
rect[3] = rect[1] + 64 + 20
try:
cropped = mat[rect[1]:(rect[3]), rect[0]:(rect[2]), :]
img = os.path.join(opath, ''.join(random.choice(string.lowercase) for i in range(8)) + ".png")
cr_h, cr_w, _ = cropped.shape
if cr_h is 84 and cr_w is 52:
cv2.imwrite(img, cropped)
except:
pass
if __name__ == "__main__":
parser = OptionParser()
parser.add_option("-i", "--input", dest="input", metavar="DIRECTORY", type="string",
help="Path to the xml collection folder.")
parser.add_option("-d", "--output-dir", dest="output", metavar="DIRECTORY", type="string",
help="Path to store data", default=".")
(options, args) = parser.parse_args()
if not options.input:
parser.error("Input folder is required.")
opath = os.path.join(options.output, datetime.now().strftime("negatives" + "-%Y-%m-%d-%H-%M-%S"))
os.mkdir(opath)
gl = glob.iglob( os.path.join(options.input, "set[0][0]_V0[0][5].seq.xml"))
for f in gl:
print f
xmldoc = minidom.parse(f)
det2negative(xmldoc, opath)