From 695827050f3b94500e99e9128850ab4daab9d7f9 Mon Sep 17 00:00:00 2001 From: "marina.kolpakova" Date: Wed, 5 Sep 2012 17:44:28 +0400 Subject: [PATCH] Integral images for ICF --- .../include/opencv2/objdetect/objdetect.hpp | 1 + modules/objdetect/src/softcascade.cpp | 88 +++++++++++++++++++++- 2 files changed, 86 insertions(+), 3 deletions(-) diff --git a/modules/objdetect/include/opencv2/objdetect/objdetect.hpp b/modules/objdetect/include/opencv2/objdetect/objdetect.hpp index 9fab741..0ef391d 100644 --- a/modules/objdetect/include/opencv2/objdetect/objdetect.hpp +++ b/modules/objdetect/include/opencv2/objdetect/objdetect.hpp @@ -507,6 +507,7 @@ public: int step = 4, int rejectfactor = 1); protected: + virtual void detectInRoi(); virtual void detectForOctave(int octave); // virtual bool detectSingleScale( const Mat& image, int stripCount, Size processingRectSize, // int stripSize, int yStep, double factor, vector& candidates, diff --git a/modules/objdetect/src/softcascade.cpp b/modules/objdetect/src/softcascade.cpp index 62d58f2..cace667 100644 --- a/modules/objdetect/src/softcascade.cpp +++ b/modules/objdetect/src/softcascade.cpp @@ -59,7 +59,7 @@ namespace { 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"; @@ -72,7 +72,7 @@ namespace { 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 @@ -131,7 +131,8 @@ namespace { 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) { @@ -324,14 +325,95 @@ bool cv::SoftCascade::load( const string& filename, const float minScale, const return true; } +namespace { + + void calcHistBins(const cv::Mat& grey, std::vector& 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 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(h); + float* ang = angle.ptr(h); + + for (int w = 0; w < mag.cols; ++w) + { + hist[(int)ang[w]].ptr(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& rois, std::vector& objects, const int step, const int rejectfactor) { + typedef std::vector::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 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) -- 2.7.4