diff --git a/modules/objdetect/src/softcascade.cpp b/modules/objdetect/src/softcascade.cpp index 9eba9bd902..73639084d3 100644 --- a/modules/objdetect/src/softcascade.cpp +++ b/modules/objdetect/src/softcascade.cpp @@ -226,11 +226,6 @@ struct Level float rescale(cv::Rect& scaledRect, const float threshold, int idx) const { // rescale - // scaledRect.x = cvRound(relScale * scaledRect.x); - // scaledRect.y = cvRound(relScale * scaledRect.y); - // scaledRect.width = cvRound(relScale * scaledRect.width); - // scaledRect.height = cvRound(relScale * scaledRect.height); - scaledRect.x = (scaleshift * scaledRect.x + R_SHIFT) >> 16; scaledRect.y = (scaleshift * scaledRect.y + R_SHIFT) >> 16; scaledRect.width = (scaleshift * scaledRect.width + R_SHIFT) >> 16; @@ -284,6 +279,8 @@ struct ChannelStorage { std::vector hog; int shrinkage; + int offset; + int step; enum {HOG_BINS = 6, HOG_LUV_BINS = 10}; @@ -391,31 +388,23 @@ struct ChannelStorage hog.push_back(mag); hog.insert(hog.end(), luvs.begin(), luvs.end()); - CV_Assert(hog.size() == 10); + + step = hog[0].cols; + + // CV_Assert(hog.size() == 10); #endif } - float get(const int x, const int y, const int channel, const cv::Rect& area) const + float get(const int channel, const cv::Rect& area) const { - CV_Assert(channel < HOG_LUV_BINS); + // CV_Assert(channel < HOG_LUV_BINS); const cv::Mat& m = hog[channel]; + int *ptr = ((int*)(m.data)) + offset; - dprintf("feature box %d %d %d %d ", area.x, area.y, area.width, area.height); - dprintf("get for channel %d\n", channel); - dprintf("!! %d\n", m.depth()); - - dprintf("extract feature for: [%d %d] [%d %d] [%d %d] [%d %d]\n", - x + area.x, y + area.y, x + area.width,y + area.y, x + area.width,y + area.height, - x + area.x, y + area.height); - - dprintf("at point %d %d with offset %d\n", x, y, 0); - - int a = m.ptr(y + area.y)[x + area.x]; - int b = m.ptr(y + area.y)[x + area.width]; - int c = m.ptr(y + area.height)[x + area.width]; - int d = m.ptr(y + area.height)[x + area.x]; - - dprintf(" retruved integral values: %d %d %d %d\n", a, b, c, d); + int a = ptr[area.y * step + area.x]; + int b = ptr[area.y * step + area.width]; + int c = ptr[area.height * step + area.width]; + int d = ptr[area.height * step + area.x]; return (a - b + c - d); } @@ -443,8 +432,7 @@ struct cv::SoftCascade::Filds typedef std::vector::iterator octIt_t; - void detectAt(const Level& level, const int dx, const int dy, const ChannelStorage& storage, - std::vector& detections) const + void detectAt(const int dx, const int dy, const Level& level, const ChannelStorage& storage, std::vector& detections) const { dprintf("detect at: %d %d\n", dx, dy); @@ -473,7 +461,7 @@ struct cv::SoftCascade::Filds float threshold = level.rescale(scaledRect, node.threshold,(int)(feature.channel > 6)) * feature.rarea; - float sum = storage.get(dx, dy, feature.channel, scaledRect); + float sum = storage.get(feature.channel, scaledRect); dprintf("root feature %d %f\n",feature.channel, sum); @@ -488,7 +476,7 @@ struct cv::SoftCascade::Filds scaledRect = fLeaf.rect; threshold = level.rescale(scaledRect, leaf.threshold, (int)(fLeaf.channel > 6)) * fLeaf.rarea; - sum = storage.get(dx, dy, fLeaf.channel, scaledRect); + sum = storage.get(fLeaf.channel, scaledRect); int lShift = (next - 1) * 2 + ((sum >= threshold) ? 1 : 0); float impact = leaves[(st * 4) + lShift]; @@ -506,16 +494,13 @@ struct cv::SoftCascade::Filds if (st - stBegin > 50 ) break; #endif - if (detectionScore <= stage.threshold) break; + if (detectionScore <= stage.threshold) return; } dprintf("x %d y %d: %d\n", dx, dy, st - stBegin); + dprintf(" got %d\n", st); - if (st == stEnd) - { - dprintf(" got %d\n", st); - level.markDetection(dx, dy, detectionScore, detections); - } + level.markDetection(dx, dy, detectionScore, detections); } octIt_t fitOctave(const float& logFactor) @@ -738,13 +723,15 @@ void cv::SoftCascade::detectMultiScale(const Mat& image, const std::vector