gui.cpp 6.73 KB
Newer Older
Patrick Snape's avatar
Patrick Snape committed
1
2
#ifndef DLIB_NO_GUI_SUPPORT

Davis King's avatar
Davis King committed
3
#include "opaque_types.h"
Patrick Snape's avatar
Patrick Snape committed
4
5
6
7
8
#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>
9
#include "simple_object_detector_py.h"
Patrick Snape's avatar
Patrick Snape committed
10
11
12

using namespace dlib;
using namespace std;
13
14

namespace py = pybind11;
Patrick Snape's avatar
Patrick Snape committed
15
16
17
18
19

// ----------------------------------------------------------------------------------------

void image_window_set_image_fhog_detector (
    image_window& win,
20
    const simple_object_detector& det
Patrick Snape's avatar
Patrick Snape committed
21
22
23
24
25
)
{
    win.set_image(draw_fhog(det));
}

26
void image_window_set_image_simple_detector_py (
Patrick Snape's avatar
Patrick Snape committed
27
    image_window& win,
28
    const simple_object_detector_py& det
Patrick Snape's avatar
Patrick Snape committed
29
30
)
{
31
    win.set_image(draw_fhog(det.detector));
Patrick Snape's avatar
Patrick Snape committed
32
33
34
35
}

// ----------------------------------------------------------------------------------------

36
template <typename T>
Patrick Snape's avatar
Patrick Snape committed
37
38
void image_window_set_image (
    image_window& win,
39
    const numpy_image<T>& img
Patrick Snape's avatar
Patrick Snape committed
40
41
)
{
42
    win.set_image(img);
Patrick Snape's avatar
Patrick Snape committed
43
44
45
46
47
48
49
50
}

void add_overlay_rect (
    image_window& win,
    const rectangle& rect,
    const rgb_pixel& color
)
{
51
    win.add_overlay(rect, color);
Patrick Snape's avatar
Patrick Snape committed
52
53
}

54
55
56
57
58
59
60
61
62
63
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);
}

Patrick Snape's avatar
Patrick Snape committed
64
65
66
67
68
69
void add_overlay_parts (
    image_window& win,
    const full_object_detection& detection,
    const rgb_pixel& color
)
{
70
    win.add_overlay(render_face_detections(detection, color));
Patrick Snape's avatar
Patrick Snape committed
71
72
}

73
74
template <typename T>
std::shared_ptr<image_window> make_image_window_from_image(const numpy_image<T>& img)
Patrick Snape's avatar
Patrick Snape committed
75
{
76
    auto win = std::make_shared<image_window>();
Patrick Snape's avatar
Patrick Snape committed
77
78
79
80
    image_window_set_image(*win, img);
    return win;
}

81
82
template <typename T>
std::shared_ptr<image_window> make_image_window_from_image_and_title(const numpy_image<T>& img, const string& title)
Patrick Snape's avatar
Patrick Snape committed
83
{
84
    auto win = std::make_shared<image_window>();
Patrick Snape's avatar
Patrick Snape committed
85
86
87
88
89
90
91
    image_window_set_image(*win, img);
    win->set_title(title);
    return win;
}

// ----------------------------------------------------------------------------------------

92
void bind_gui(py::module& m)
Patrick Snape's avatar
Patrick Snape committed
93
94
95
96
97
{
    {
    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);
98
99
100
101

    const char* docs1 = "Create an image window that displays the given numpy image.";
    const char* docs2 = "Create an image window that displays the given numpy image and also has the given title.";
    const char* docs3 = "Make the image_window display the given image.";
102
    py::class_<type, std::shared_ptr<type>>(m, "image_window",
Patrick Snape's avatar
Patrick Snape committed
103
        "This is a GUI window capable of showing images on the screen.")
104
        .def(py::init())
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
        .def(py::init(&make_image_window_from_image<uint8_t>))
        .def(py::init(&make_image_window_from_image<uint16_t>))
        .def(py::init(&make_image_window_from_image<uint32_t>))
        .def(py::init(&make_image_window_from_image<uint64_t>))
        .def(py::init(&make_image_window_from_image<int8_t>))
        .def(py::init(&make_image_window_from_image<int16_t>))
        .def(py::init(&make_image_window_from_image<int32_t>))
        .def(py::init(&make_image_window_from_image<int64_t>))
        .def(py::init(&make_image_window_from_image<float>))
        .def(py::init(&make_image_window_from_image<double>))
        .def(py::init(&make_image_window_from_image<rgb_pixel>), docs1)
        .def(py::init(&make_image_window_from_image_and_title<uint8_t>))
        .def(py::init(&make_image_window_from_image_and_title<uint16_t>))
        .def(py::init(&make_image_window_from_image_and_title<uint32_t>))
        .def(py::init(&make_image_window_from_image_and_title<uint64_t>))
        .def(py::init(&make_image_window_from_image_and_title<int8_t>))
        .def(py::init(&make_image_window_from_image_and_title<int16_t>))
        .def(py::init(&make_image_window_from_image_and_title<int32_t>))
        .def(py::init(&make_image_window_from_image_and_title<int64_t>))
        .def(py::init(&make_image_window_from_image_and_title<float>))
        .def(py::init(&make_image_window_from_image_and_title<double>))
        .def(py::init(&make_image_window_from_image_and_title<rgb_pixel>), docs2)
127
        .def("set_image", image_window_set_image_simple_detector_py, py::arg("detector"),
Patrick Snape's avatar
Patrick Snape committed
128
            "Make the image_window display the given HOG detector's filters.")
129
        .def("set_image", image_window_set_image_fhog_detector, py::arg("detector"),
Patrick Snape's avatar
Patrick Snape committed
130
            "Make the image_window display the given HOG detector's filters.")
131
132
133
134
135
136
137
138
139
140
141
        .def("set_image", image_window_set_image<uint8_t>, py::arg("image"))
        .def("set_image", image_window_set_image<uint16_t>, py::arg("image"))
        .def("set_image", image_window_set_image<uint32_t>, py::arg("image"))
        .def("set_image", image_window_set_image<uint64_t>, py::arg("image"))
        .def("set_image", image_window_set_image<int8_t>, py::arg("image"))
        .def("set_image", image_window_set_image<int16_t>, py::arg("image"))
        .def("set_image", image_window_set_image<int32_t>, py::arg("image"))
        .def("set_image", image_window_set_image<int64_t>, py::arg("image"))
        .def("set_image", image_window_set_image<float>, py::arg("image"))
        .def("set_image", image_window_set_image<double>, py::arg("image"))
        .def("set_image", image_window_set_image<rgb_pixel>, py::arg("image"), docs3)
142
        .def("set_title", (set_title_funct)&type::set_title, py::arg("title"),
Patrick Snape's avatar
Patrick Snape committed
143
144
            "Set the title of the window to the given value.")
        .def("clear_overlay", &type::clear_overlay, "Remove all overlays from the image_window.")
145
        .def("add_overlay", (add_overlay_funct)&type::add_overlay<rgb_pixel>, py::arg("rectangles"), py::arg("color")=rgb_pixel(255, 0, 0),
Patrick Snape's avatar
Patrick Snape committed
146
            "Add a list of rectangles to the image_window. They will be displayed as red boxes by default, but the color can be passed.")
147
        .def("add_overlay", add_overlay_rect, py::arg("rectangle"), py::arg("color")=rgb_pixel(255, 0, 0),
Patrick Snape's avatar
Patrick Snape committed
148
            "Add a rectangle to the image_window.  It will be displayed as a red box by default, but the color can be passed.")
149
        .def("add_overlay", add_overlay_drect, py::arg("rectangle"), py::arg("color")=rgb_pixel(255, 0, 0),
150
            "Add a rectangle to the image_window.  It will be displayed as a red box by default, but the color can be passed.")
151
        .def("add_overlay", add_overlay_parts, py::arg("detection"), py::arg("color")=rgb_pixel(0, 0, 255),
Patrick Snape's avatar
Patrick Snape committed
152
153
154
155
156
157
            "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