add script for negatives extraction
authormarina.kolpakova <marina.kolpakova@itseez.com>
Fri, 11 Jan 2013 23:16:11 +0000 (03:16 +0400)
committermarina.kolpakova <marina.kolpakova@itseez.com>
Fri, 1 Feb 2013 10:35:28 +0000 (14:35 +0400)
apps/sft/misk/detections2negatives.py [new file with mode: 0755]

diff --git a/apps/sft/misk/detections2negatives.py b/apps/sft/misk/detections2negatives.py
new file mode 100755 (executable)
index 0000000..02b045f
--- /dev/null
@@ -0,0 +1,81 @@
+#!/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]), :]
+                        cv2.imshow("mat", cropped)
+                        cv2.waitKey(10)
+                        img = os.path.join(opath, ''.join(random.choice(string.lowercase) for i in range(8)) + ".png")
+                        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-1][0-9]_V0[0-9][0-9].seq.xml"))
+    for f in gl:
+        print f
+        xmldoc = minidom.parse(f)
+        det2negative(xmldoc, opath)