26 #include <linux/videodev2.h>
29 #include <opencv2/opencv.hpp>
34 #define PATHPREFIX "/jevois/data/saliencysurf/"
47 JEVOIS_DECLARE_PARAMETER(save,
bool,
"Save regions when true, useful to create a training set. They will be saved to "
113 itsSaliency = addSubComponent<Saliency>(
"saliency");
114 itsMatcher = addSubComponent<ObjectMatcher>(
"surf");
129 itsRunFut =
jevois::async(std::bind(&SaliencySURF::run,
this));
131 LINFO(
"Using " << itsMatcher->numtrain() <<
" Training Images.");
140 itsBuf.
push(cv::Mat());
143 LINFO(
"Waiting for writer thread to complete, " << itsBuf.
filled_size() <<
" frames to go...");
145 LINFO(
"Writer thread completed. Syncing disk...");
158 inimg.
require(
"input",
w,
h, V4L2_PIX_FMT_YUYV);
171 outimg = outframe.get();
179 itsSaliency->process(inimg,
false);
182 int const smlev = itsSaliency->smscale::get();
183 int const smfac = (1 << smlev);
184 int const rwh = rsiz::get();
191 for (
size_t i = 0; i < regions::get(); ++i)
194 int mx, my;
intg32 msal; itsSaliency->getSaliencyMax(mx, my, msal);
197 unsigned int const dmx = (mx << smlev) + (smfac >> 2);
198 unsigned int const dmy = (my << smlev) + (smfac >> 2);
199 int rx = (std::min(
int(
w) - rwh/2, std::max(rwh/2,
int(dmx + 1 + (smfac >> 2))))) & (~1);
200 int ry = (std::min(
int(
h) - rwh/2, std::max(rwh/2,
int(dmy + 1 + (smfac >> 2))))) & (~1);
201 unsigned short col = jevois::yuyv::White;
204 cv::Mat
roi = grayimg(cv::Rect(rx - rwh/2, ry - rwh/2, rwh, rwh));
207 if (save::get()) itsBuf.
push(
roi);
211 double dist = itsMatcher->process(
roi, trainidx);
215 " avg distance " +
std::to_string(dist), 3,
h + k*12 + 2, jevois::yuyv::White);
216 col = jevois::yuyv::LightGreen;
224 itsSaliency->inhibitionOfReturn(mx, my, inhsigma::get() / smfac);
228 std::string
const & fpscpu = timer.
stop();
239 size_t frame = 0;
char tmp[2048];
242 std::string
const cmd =
"/bin/mkdir -p " PATHPREFIX;
243 if (
std::system(cmd.c_str()))
LERROR(
"Error running [" << cmd <<
"] -- IGNORED");
248 cv::Mat im = itsBuf.
pop();
251 if (im.empty())
break;
255 cv::imwrite(tmp, im);
258 if ((++
frame % 100) == 0)
LINFO(
"Saved " <<
frame <<
" salient regions.");
262 std::shared_ptr<ObjectMatcher> itsMatcher;
263 std::shared_ptr<Saliency> itsSaliency;
264 std::future<void> itsRunFut;