summaryrefslogtreecommitdiffstats
path: root/ml/dlib/tools/python/src/gui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/tools/python/src/gui.cpp')
-rw-r--r--ml/dlib/tools/python/src/gui.cpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/ml/dlib/tools/python/src/gui.cpp b/ml/dlib/tools/python/src/gui.cpp
new file mode 100644
index 000000000..418cfaae3
--- /dev/null
+++ b/ml/dlib/tools/python/src/gui.cpp
@@ -0,0 +1,128 @@
+#ifndef DLIB_NO_GUI_SUPPORT
+
+#include "opaque_types.h"
+#include <dlib/python.h>
+#include <dlib/geometry.h>
+#include <dlib/image_processing/frontal_face_detector.h>
+#include <dlib/image_processing/render_face_detections.h>
+#include <dlib/gui_widgets.h>
+#include "simple_object_detector_py.h"
+
+using namespace dlib;
+using namespace std;
+
+namespace py = pybind11;
+
+// ----------------------------------------------------------------------------------------
+
+void image_window_set_image_fhog_detector (
+ image_window& win,
+ const simple_object_detector& det
+)
+{
+ win.set_image(draw_fhog(det));
+}
+
+void image_window_set_image_simple_detector_py (
+ image_window& win,
+ const simple_object_detector_py& det
+)
+{
+ win.set_image(draw_fhog(det.detector));
+}
+
+// ----------------------------------------------------------------------------------------
+
+void image_window_set_image (
+ image_window& win,
+ py::object img
+)
+{
+ if (is_gray_python_image(img))
+ return win.set_image(numpy_gray_image(img));
+ else if (is_rgb_python_image(img))
+ return win.set_image(numpy_rgb_image(img));
+ else
+ throw dlib::error("Unsupported image type, must be 8bit gray or RGB image.");
+}
+
+void add_overlay_rect (
+ image_window& win,
+ const rectangle& rect,
+ const rgb_pixel& color
+)
+{
+ win.add_overlay(rect, color);
+}
+
+void add_overlay_drect (
+ image_window& win,
+ const drectangle& drect,
+ const rgb_pixel& color
+)
+{
+ rectangle rect(drect.left(), drect.top(), drect.right(), drect.bottom());
+ win.add_overlay(rect, color);
+}
+
+void add_overlay_parts (
+ image_window& win,
+ const full_object_detection& detection,
+ const rgb_pixel& color
+)
+{
+ win.add_overlay(render_face_detections(detection, color));
+}
+
+std::shared_ptr<image_window> make_image_window_from_image(py::object img)
+{
+ auto win = std::make_shared<image_window>();
+ image_window_set_image(*win, img);
+ return win;
+}
+
+std::shared_ptr<image_window> make_image_window_from_image_and_title(py::object img, const string& title)
+{
+ auto win = std::make_shared<image_window>();
+ image_window_set_image(*win, img);
+ win->set_title(title);
+ return win;
+}
+
+// ----------------------------------------------------------------------------------------
+
+void bind_gui(py::module& m)
+{
+ {
+ typedef image_window type;
+ typedef void (image_window::*set_title_funct)(const std::string&);
+ typedef void (image_window::*add_overlay_funct)(const std::vector<rectangle>& r, rgb_pixel p);
+ py::class_<type, std::shared_ptr<type>>(m, "image_window",
+ "This is a GUI window capable of showing images on the screen.")
+ .def(py::init())
+ .def(py::init(&make_image_window_from_image),
+ "Create an image window that displays the given numpy image.")
+ .def(py::init(&make_image_window_from_image_and_title),
+ "Create an image window that displays the given numpy image and also has the given title.")
+ .def("set_image", image_window_set_image_simple_detector_py, py::arg("detector"),
+ "Make the image_window display the given HOG detector's filters.")
+ .def("set_image", image_window_set_image_fhog_detector, py::arg("detector"),
+ "Make the image_window display the given HOG detector's filters.")
+ .def("set_image", image_window_set_image, py::arg("image"),
+ "Make the image_window display the given image.")
+ .def("set_title", (set_title_funct)&type::set_title, py::arg("title"),
+ "Set the title of the window to the given value.")
+ .def("clear_overlay", &type::clear_overlay, "Remove all overlays from the image_window.")
+ .def("add_overlay", (add_overlay_funct)&type::add_overlay<rgb_pixel>, py::arg("rectangles"), py::arg("color")=rgb_pixel(255, 0, 0),
+ "Add a list of rectangles to the image_window. They will be displayed as red boxes by default, but the color can be passed.")
+ .def("add_overlay", add_overlay_rect, py::arg("rectangle"), py::arg("color")=rgb_pixel(255, 0, 0),
+ "Add a rectangle to the image_window. It will be displayed as a red box by default, but the color can be passed.")
+ .def("add_overlay", add_overlay_drect, py::arg("rectangle"), py::arg("color")=rgb_pixel(255, 0, 0),
+ "Add a rectangle to the image_window. It will be displayed as a red box by default, but the color can be passed.")
+ .def("add_overlay", add_overlay_parts, py::arg("detection"), py::arg("color")=rgb_pixel(0, 0, 255),
+ "Add full_object_detection parts to the image window. They will be displayed as blue lines by default, but the color can be passed.")
+ .def("wait_until_closed", &type::wait_until_closed,
+ "This function blocks until the window is closed.");
+ }
+}
+#endif