int ImageRep::MeanHsv(const IntRect& rRect, int channel) const { assert(rRect.XMin() >= 0 && rRect.YMin() >= 0 && rRect.XMax() <= m_images[0].cols && rRect.YMax() <= m_images[0].rows); int sum_v = m_integralHsvImages[channel].at<int>(rRect.YMin(), rRect.XMin()) + m_integralHsvImages[channel].at<int>(rRect.YMax(), rRect.XMax()) - m_integralHsvImages[channel].at<int>(rRect.YMax(), rRect.XMin()) - m_integralHsvImages[channel].at<int>(rRect.YMin(), rRect.XMax()); return sum_v / rRect.Area(); }
int ImageRep::Sum(const IntRect& rRect, int channel) const { assert(rRect.XMin() >= 0 && rRect.YMin() >= 0 && rRect.XMax() <= m_images[0].cols && rRect.YMax() <= m_images[0].rows); return m_integralImages[channel].at<int>(rRect.YMin(), rRect.XMin()) + m_integralImages[channel].at<int>(rRect.YMax(), rRect.XMax()) - m_integralImages[channel].at<int>(rRect.YMax(), rRect.XMin()) - m_integralImages[channel].at<int>(rRect.YMin(), rRect.XMax()); }
void ImageRep::Hist(const IntRect& rRect, Eigen::VectorXd& h) const { assert(rRect.XMin() >= 0 && rRect.YMin() >= 0 && rRect.XMax() <= m_images[0].cols && rRect.YMax() <= m_images[0].rows); int norm = rRect.Area(); for (int i = 0; i < kNumBins; ++i) { int sum = m_integralHistImages[i].at<int>(rRect.YMin(), rRect.XMin()) + m_integralHistImages[i].at<int>(rRect.YMax(), rRect.XMax()) - m_integralHistImages[i].at<int>(rRect.YMax(), rRect.XMin()) - m_integralHistImages[i].at<int>(rRect.YMin(), rRect.XMax()); h[i] = (float)sum/norm; } }
void onMouse(int event, int x, int y, int, void*) { if (selectObject) { selectionRegion.SetXMin(MIN(x, originMouse.x)); selectionRegion.SetYMin(MIN(y, originMouse.y)); selectionRegion.SetWidth(std::abs(x - originMouse.x)); selectionRegion.SetHeight(std::abs(y - originMouse.y)); } switch (event) { case CV_EVENT_LBUTTONDOWN: printf("buttondown: x:%d,y:%d\n",x,y); originMouse = Point(x, y); selectionRegion = IntRect(x, y, 0, 0); selectObject = true; break; case CV_EVENT_LBUTTONUP: selectObject = false; newregion = true; trackObject = -1; printf("buttonup: x:%d,y:%d,width:%d,height:%d\n", selectionRegion.XMin(), selectionRegion.YMin(), selectionRegion.Height(), selectionRegion.Width()); break; } }
void HsvFeatures::UpdateFeatureVector(const Sample &s) { IntRect rect = s.GetROI(); cv::Rect roi(rect.XMin(), rect.YMin(), rect.Width(), rect.Height()); m_featVec.setZero(); cv::Mat hsv_img = s.GetImage().GetHsvImage()(roi); int height = rect.Height(); int width = rect.Width(); // continuous? if(hsv_img.isContinuous()) { width *= height; height = 1; } int ix, iy; uchar *p; for(iy=0; iy < height; ++iy) { p = hsv_img.ptr<uchar>(iy); for(ix=0; ix < width; ++ix) { cv::Vec3b pixel(p[3*ix+0], p[3*ix+1], p[3*ix+2]); auto bin_idx = compBinIdx(pixel); m_featVec[bin_idx]++; } } m_featVec /= rect.Area(); }
void RawFeatures::UpdateFeatureVector(const Sample& s) { IntRect rect = s.GetROI(); // note this truncates to integers cv::Rect roi(rect.XMin(), rect.YMin(), rect.Width(), rect.Height()); cv::resize(s.GetImage().GetImage(0)(roi), m_patchImage, m_patchImage.size()); //equalizeHist(m_patchImage, m_patchImage); int ind = 0; for (int i = 0; i < kPatchSize; ++i) { uchar* pixel = m_patchImage.ptr(i); for (int j = 0; j < kPatchSize; ++j, ++pixel, ++ind) { m_featVec[ind] = ((double)*pixel)/255; } } }
void LaRank::Update(const MultiSample& sample, int y) { // add new support pattern SupportPattern* sp = new SupportPattern; const vector<FloatRect>& rects = sample.GetRects(); FloatRect centre = rects[y]; for (int i = 0; i < (int)rects.size(); ++i) { // express r in coord frame of centre sample FloatRect r = rects[i]; r.Translate(-centre.XMin(), -centre.YMin()); sp->yv.push_back(r); if (!m_config.quietMode && m_config.debugMode) { // store a thumbnail for each sample Mat im(kTileSize, kTileSize, CV_8UC1); IntRect rect = rects[i]; cv::Rect roi(rect.XMin(), rect.YMin(), rect.Width(), rect.Height()); cv::resize(sample.GetImage().GetImage(0)(roi), im, im.size()); sp->images.push_back(im); } } // evaluate features for each sample sp->x.resize(rects.size()); const_cast<Features&>(m_features).Eval(sample, sp->x); sp->y = y; sp->refCount = 0; m_sps.push_back(sp); ProcessNew((int)m_sps.size()-1); BudgetMaintenance(); for (int i = 0; i < 10; ++i) { Reprocess(); BudgetMaintenance(); } }