Octave(){}
Octave(const cv::FileNode& fn) : scale((float)fn[SC_OCT_SCALE]), stages((int)fn[SC_OCT_STAGES])
- {printf("octave: %f %d\n", scale, stages);}
+ {/*printf("octave: %f %d\n", scale, stages);*/}
};
static const char *SC_STAGE_THRESHOLD = "stageThreshold";
Stage(){}
Stage(const cv::FileNode& fn) : threshold((float)fn[SC_STAGE_THRESHOLD]), weight((float)fn[SC_STAGE_WEIGHT])
- {printf(" stage: %f %f\n",threshold, weight);}
+ {/*printf(" stage: %f %f\n",threshold, weight);*/}
};
// according to R. Benenson, M. Mathias, R. Timofte and L. Van Gool paper
cv::FileNode rn = fn[SC_F_RECT];
cv::FileNodeIterator r_it = rn.begin();
rect = cv::Rect(*(r_it++), *(r_it++), *(r_it++), *(r_it++));
- printf(" feature: %f %d %d [%d %d %d %d]\n",threshold, direction, channel, rect.x, rect.y, rect.width, rect.height);}
+ // printf(" feature: %f %d %d [%d %d %d %d]\n",threshold, direction, channel, rect.x, rect.y, rect.width, rect.height);
+ }
Feature rescale(float relScale)
{
return true;
}
+namespace {
+
+ void calcHistBins(const cv::Mat& grey, std::vector<cv::Mat>& histInts, const int bins)
+ {
+ CV_Assert( grey.type() == CV_8U);
+ const int rows = grey.rows + 1;
+ const int cols = grey.cols + 1;
+ cv::Size intSumSize(cols, rows);
+
+ histInts.clear();
+ std::vector<cv::Mat> hist;
+ for (int bin = 0; bin < bins; ++bin)
+ {
+ hist.push_back(cv::Mat(rows, cols, CV_32FC1));
+ }
+ cv::Mat df_dx, df_dy, mag, angle;
+ cv::Sobel(grey, df_dx, CV_32F, 1, 0);
+ cv::Sobel(grey, df_dy, CV_32F, 0, 1);
+
+ cv::cartToPolar(df_dx, df_dy, mag, angle, true);
+
+ const float magnitudeScaling = 1.0 / sqrt(2);
+ mag *= magnitudeScaling;
+ angle /= 60;
+
+ for (int h = 0; h < mag.rows; ++h)
+ {
+ float* magnitude = mag.ptr<float>(h);
+ float* ang = angle.ptr<float>(h);
+
+ for (int w = 0; w < mag.cols; ++w)
+ {
+ hist[(int)ang[w]].ptr<float>(h)[w] = magnitude[w];
+ }
+ }
+
+ for (int bin = 0; bin < bins; ++bin)
+ {
+ cv::Mat sum;
+ cv::integral(hist[bin], sum);
+ histInts.push_back(sum);
+ }
+
+ cv::Mat magIntegral;
+ cv::integral(mag, magIntegral, mag.depth());
+ }
+
+ struct Integrals
+ {
+ /* data */
+ };
+}
+
+void cv::SoftCascade::detectInRoi()
+{}
+
+
void cv::SoftCascade::detectMultiScale(const Mat& image, const std::vector<cv::Rect>& rois, std::vector<cv::Rect>& objects,
const int step, const int rejectfactor)
{
+ typedef std::vector<cv::Rect>::const_iterator RIter_t;
// only color images are supperted
CV_Assert(image.type() == CV_8UC3);
// only this window size allowed
CV_Assert(image.cols == 640 && image.rows == 480);
+
+ objects.clear();
+
+ // create integrals
+ cv::Mat luv;
+ cv::cvtColor(image, luv, CV_BGR2Luv);
+
+ cv::Mat luvIntegral;
+ cv::integral(luv, luvIntegral);
+
+ cv::Mat grey;
+ cv::cvtColor(image, grey, CV_RGB2GRAY);
+
+ std::vector<cv::Mat> hist;
+ const int bins = 6;
+ calcHistBins(grey, hist, bins);
+
+ for (RIter_t it = rois.begin(); it != rois.end(); ++it)
+ {
+ const cv::Rect& roi = *it;
+ // detectInRoi(roi, objects, step);
+ }
+
}
void cv::SoftCascade::detectForOctave(const int octave)