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));
65 cv::MatSize
const rs = results.size;
66 T
const * r =
reinterpret_cast<T
const *
>(results.data);
72 case jevois::dnn::postprocessor::SegType::ClassesHWC:
76 if (rs.dims() != 4 || rs[0] != 1)
78 int const numclass = rs[3];
int const siz = rs[1] * rs[2] * numclass;
81 itsOverlay = cv::Mat(rs[1], rs[2], CV_8UC4);
82 uint32_t * im =
reinterpret_cast<uint32_t *
>(itsOverlay.data);
84 for (
int i = 0; i < siz; i += numclass)
86 int maxc = -1; T maxval = thresh;
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::ClassesCHW:
104 if (rs.dims() != 4 || rs[0] != 1)
106 int const numclass = rs[1];
int const hw = rs[2] * rs[3];
109 itsOverlay = cv::Mat(rs[2], rs[3], CV_8UC4);
110 uint32_t * im =
reinterpret_cast<uint32_t *
>(itsOverlay.data);
112 for (
int i = 0; i < hw; ++i)
114 int maxc = -1; T maxval = thresh;
115 for (
int c = 0; c < numclass; ++c)
117 T v = results.at<T>(i + c * hw);
118 if (v > maxval) { maxval = v; maxc = c; }
122 if (maxc < 0 || maxc > 255 || maxc == bgclass) *im++ = 0;
else *im++ = itsColor[maxc] | alph;
128 case jevois::dnn::postprocessor::SegType::ArgMax:
131 if (rs.dims() != 2 && (rs.dims() != 3 || rs[0] != 1) && (rs.dims() != 4 || rs[0] != 1 || rs[3] != 1))
133 int const siz = rs[1] * rs[2];
136 itsOverlay = cv::Mat(rs[1], rs[2], CV_8UC4);
137 uint32_t * im =
reinterpret_cast<uint32_t *
>(itsOverlay.data);
139 for (
int i = 0; i < siz; ++i)
142 int32_t
const id = *r++;
143 if (id < 0 || id > 255 ||
id == bgclass) *im++ = 0;
else *im++ = itsColor[id] | alph;
153 if (outs.size() != 1)
LFATAL(
"Need exactly one output blob, received " << outs.size());
156 if (
bgid::get() != 0) itsColor[0] = 0xff0000;
else itsColor[0] = 0;
159 cv::Mat
const & results = outs[0];
161 switch (results.type())
163 case CV_8UC1: process<uint8_t>(results);
break;
164 case CV_16UC1: process<uint16_t>(results);
break;
165 case CV_32FC1: process<float>(results);
break;
166 case CV_32SC1: process<int32_t>(results);
break;
178 bool JEVOIS_UNUSED_PARAM(idle))
184 if (itsOverlay.empty())
return;
197 ImVec2 tl = helper->
i2d(itsTLx, itsTLy), br = helper->
i2d(itsBRx, itsBRy);
198 int dtlx = tl.x, dtly = tl.y;
199 unsigned short dw = br.x - tl.x, dh = br.y - tl.y;
202 helper->
drawImage(
"ppsr", itsOverlay,
true, dtlx, dtly, dw, dh,
false ,
true );