mirror of https://github.com/opencv/opencv.git
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
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)
|
|
|