26 #include <opencv2/dnn.hpp>
39 segtype::freeze(doit);
46 for (
size_t i = 0; i < 256; ++i)
48 uint32_t & c = itsColor[i]; c = 0;
51 for (
int shift = 7; shift >= 0; --shift)
53 for (
int channel = 0; channel < 3; ++channel) c |= ((ind >> channel) & 1) << (shift + 8 * (3-channel));
62 if (outs.empty())
return;
67 case jevois::dnn::postprocessor::SegType::Classes:
71 cv::Mat results = outs[0]; cv::MatSize rs = results.size;
72 if (rs.dims() != 4 || rs[0] != 1 || results.type() != CV_8UC1)
74 int const numclass = rs[3];
int const siz = rs[1] * rs[2] * numclass;
78 int const bgclass =
bgid::get();
if (bgclass != 0) itsColor[0] = 0xff0000;
else itsColor[0] = 0;
80 itsOverlay = cv::Mat(rs[1], rs[2], CV_8UC4);
81 uint32_t * im =
reinterpret_cast<uint32_t *
>(itsOverlay.data);
82 uint8_t * r =
reinterpret_cast<uint8_t *
>(results.data);
84 for (
int i = 0; i < siz; i += numclass)
86 int maxc = -1;
int maxval = -1;
87 for (
int c = 0; c < numclass; ++c)
90 if (v > maxval) { maxval = v; maxc = c; }
94 if (maxc < 0 || maxc > 255 || maxc == bgclass) *im++ = 0;
else *im++ = itsColor[maxc] | alph;
100 case jevois::dnn::postprocessor::SegType::Classes2:
104 cv::Mat results = outs[0]; cv::MatSize rs = results.size;
105 if (rs.dims() != 4 || rs[0] != 1 || results.type() != CV_32FC1)
107 int const numclass = rs[1];
int const siz = rs[2] * rs[3];
111 int const bgclass =
bgid::get();
if (bgclass != 0) itsColor[0] = 0xff0000;
else itsColor[0] = 0;
113 itsOverlay = cv::Mat(rs[2], rs[3], CV_8UC4);
114 uint32_t * im =
reinterpret_cast<uint32_t *
>(itsOverlay.data);
116 for (
int i = 0; i < siz; ++i)
118 int maxc = -1;
float maxval = -1.0F;
119 for (
int c = 0; c < numclass; ++c)
121 float v = results.at<
float>(i + c*siz);
122 if (v > maxval) { maxval = v; maxc = c; }
126 if (maxc < 0 || maxc > 255 || maxc == bgclass) *im++ = 0;
else *im++ = itsColor[maxc] | alph;
132 case jevois::dnn::postprocessor::SegType::ArgMax:
135 cv::Mat results = outs[0]; cv::MatSize rs = results.size;
136 if (rs.dims() != 3 || rs[0] != 1 || results.type() != CV_32SC1)
138 int const siz = rs[1] * rs[2];
142 int const bgclass =
bgid::get();
if (bgclass != 0) itsColor[0] = 0xff0000;
else itsColor[0] = 0;
144 itsOverlay = cv::Mat(rs[1], rs[2], CV_8UC4);
145 uint32_t * im =
reinterpret_cast<uint32_t *
>(itsOverlay.data);
146 int32_t
const * r =
reinterpret_cast<int32_t
const *
>(results.data);
148 for (
int i = 0; i < siz; ++i)
151 int32_t
const id = *r++;
152 if (id < 0 || id > 255 ||
id == bgclass) *im++ = 0;
else *im++ = itsColor[id] | alph;
165 bool JEVOIS_UNUSED_PARAM(idle))
171 if (itsOverlay.empty())
return;
184 ImVec2 tl = helper->
i2d(itsTLx, itsTLy), br = helper->
i2d(itsBRx, itsBRy);
185 int dtlx = tl.x, dtly = tl.y;
186 unsigned short dw = br.x - tl.x, dh = br.y - tl.y;
189 helper->
drawImage(
"ppsr", itsOverlay,
true, dtlx, dtly, dw, dh,
false ,
true );