diff --git a/modules/softcascade/include/opencv2/softcascade.hpp b/modules/softcascade/include/opencv2/softcascade.hpp index 0e1857deb..be418bc64 100644 --- a/modules/softcascade/include/opencv2/softcascade.hpp +++ b/modules/softcascade/include/opencv2/softcascade.hpp @@ -49,18 +49,21 @@ namespace cv { namespace softcascade { // Representation of detectors result. +// We assume that image is less then 2^16x2^16. struct CV_EXPORTS Detection { - // Default object type. - enum {PEDESTRIAN = 1}; - // Creates Detection from an object bounding box and confidence. // Param b is a bounding box // Param c is a confidence that object belongs to class k // Param k is an object class - Detection(const cv::Rect& b, const float c, int k = PEDESTRIAN) : bb(b), confidence(c), kind(k) {} + Detection(const cv::Rect& b, const float c, int k = PEDESTRIAN); + cv::Rect bb() const; + enum {PEDESTRIAN = 1}; - cv::Rect bb; + ushort x; + ushort y; + ushort w; + ushort h; float confidence; int kind; }; @@ -247,19 +250,6 @@ class CV_EXPORTS SCascade : public cv::Algorithm { public: - // Representation of detectors result. - struct CV_EXPORTS Detection - { - ushort x; - ushort y; - ushort w; - ushort h; - float confidence; - int kind; - - enum {PEDESTRIAN = 0}; - }; - enum { NO_REJECT = 1, DOLLAR = 2, /*PASCAL = 4,*/ DEFAULT = NO_REJECT, NMS_MASK = 0xF}; // An empty cascade will be created. diff --git a/modules/softcascade/perf/perf_cuda_softcascade.cpp b/modules/softcascade/perf/perf_cuda_softcascade.cpp index 86b7c7dd0..1c4061f65 100644 --- a/modules/softcascade/perf/perf_cuda_softcascade.cpp +++ b/modules/softcascade/perf/perf_cuda_softcascade.cpp @@ -27,8 +27,8 @@ void fixture##_##name::__cpu() { FAIL() << "No such CPU implementation analogy"; namespace { struct DetectionLess { - bool operator()(const cv::softcascade::SCascade::Detection& a, - const cv::softcascade::SCascade::Detection& b) const + bool operator()(const cv::softcascade::Detection& a, + const cv::softcascade::Detection& b) const { if (a.x != b.x) return a.x < b.x; else if (a.y != b.y) return a.y < b.y; @@ -41,7 +41,7 @@ namespace { { cv::Mat detections(objects); - typedef cv::softcascade::SCascade::Detection Detection; + typedef cv::softcascade::Detection Detection; Detection* begin = (Detection*)(detections.ptr(0)); Detection* end = (Detection*)(detections.ptr(0) + detections.cols); std::sort(begin, end, DetectionLess()); @@ -73,7 +73,7 @@ RUN_GPU(SCascadeTest, detect) ASSERT_TRUE(cascade.load(fs.getFirstTopLevelNode())); - cv::gpu::GpuMat objectBoxes(1, 10000 * sizeof(cv::softcascade::SCascade::Detection), CV_8UC1), rois(colored.size(), CV_8UC1); + cv::gpu::GpuMat objectBoxes(1, 10000 * sizeof(cv::softcascade::Detection), CV_8UC1), rois(colored.size(), CV_8UC1); rois.setTo(1); cascade.detect(colored, rois, objectBoxes); @@ -215,7 +215,7 @@ RUN_GPU(SCascadeTest, detectStream) ASSERT_TRUE(cascade.load(fs.getFirstTopLevelNode())); - cv::gpu::GpuMat objectBoxes(1, 10000 * sizeof(cv::softcascade::SCascade::Detection), CV_8UC1), rois(colored.size(), CV_8UC1); + cv::gpu::GpuMat objectBoxes(1, 10000 * sizeof(cv::softcascade::Detection), CV_8UC1), rois(colored.size(), CV_8UC1); rois.setTo(1); cv::gpu::Stream s; diff --git a/modules/softcascade/perf/perf_softcascade.cpp b/modules/softcascade/perf/perf_softcascade.cpp index 2e9d00310..c8f9fab9e 100644 --- a/modules/softcascade/perf/perf_softcascade.cpp +++ b/modules/softcascade/perf/perf_softcascade.cpp @@ -17,7 +17,7 @@ void extractRacts(std::vector objectBoxes, std::vector& rects) { rects.clear(); for (int i = 0; i < (int)objectBoxes.size(); ++i) - rects.push_back(objectBoxes[i].bb); + rects.push_back(objectBoxes[i].bb()); } } diff --git a/modules/softcascade/src/softcascade.cpp b/modules/softcascade/src/detector.cpp similarity index 92% rename from modules/softcascade/src/softcascade.cpp rename to modules/softcascade/src/detector.cpp index 197230d75..1a3cae200 100644 --- a/modules/softcascade/src/softcascade.cpp +++ b/modules/softcascade/src/detector.cpp @@ -42,11 +42,14 @@ #include "precomp.hpp" -using cv::softcascade::Detection; -using cv::softcascade::Detector; -using cv::softcascade::ChannelFeatureBuilder; +cv::softcascade::Detection::Detection(const cv::Rect& b, const float c, int k) +: x(static_cast(b.x)), y(static_cast(b.y)), + w(static_cast(b.width)), h(static_cast(b.height)), confidence(c), kind(k) {} -using namespace cv; +cv::Rect cv::softcascade::Detection::bb() const +{ + return cv::Rect(x, y, w, h); +} namespace { @@ -151,13 +154,13 @@ struct Level scaleshift = static_cast(relScale * (1 << 16)); } - void addDetection(const int x, const int y, float confidence, std::vector& detections) const + void addDetection(const int x, const int y, float confidence, std::vector& detections) const { // fix me int shrinkage = 4;//(*octave).shrinkage; cv::Rect rect(cvRound(x * shrinkage), cvRound(y * shrinkage), objSize.width, objSize.height); - detections.push_back(Detection(rect, confidence)); + detections.push_back(cv::softcascade::Detection(rect, confidence)); } float rescale(cv::Rect& scaledRect, const float threshold, int idx) const @@ -183,7 +186,7 @@ struct ChannelStorage size_t step; int model_height; - cv::Ptr builder; + cv::Ptr builder; enum {HOG_BINS = 6, HOG_LUV_BINS = 10}; @@ -192,7 +195,7 @@ struct ChannelStorage model_height = cvRound(colored.rows / (float)shrinkage); if (featureTypeStr == "ICF") featureTypeStr = "HOG6MagLuv"; - builder = ChannelFeatureBuilder::create(featureTypeStr); + builder = cv::softcascade::ChannelFeatureBuilder::create(featureTypeStr); (*builder)(colored, hog, cv::Size(cvRound(colored.cols / (float)shrinkage), model_height)); step = hog.step1(); @@ -213,8 +216,7 @@ struct ChannelStorage } - -struct Detector::Fields +struct cv::softcascade::Detector::Fields { float minScale; float maxScale; @@ -421,17 +423,17 @@ struct Detector::Fields } }; -Detector::Detector(const double mins, const double maxs, const int nsc, const int rej) +cv::softcascade::Detector::Detector(const double mins, const double maxs, const int nsc, const int rej) : fields(0), minScale(mins), maxScale(maxs), scales(nsc), rejCriteria(rej) {} -Detector::~Detector() { delete fields;} +cv::softcascade::Detector::~Detector() { delete fields;} -void Detector::read(const cv::FileNode& fn) +void cv::softcascade::Detector::read(const cv::FileNode& fn) { Algorithm::read(fn); } -bool Detector::load(const cv::FileNode& fn) +bool cv::softcascade::Detector::load(const cv::FileNode& fn) { if (fields) delete fields; @@ -473,7 +475,7 @@ void DollarNMS(dvector& objects) { const Detection &b = *next; - const float ovl = overlap(a.bb, b.bb) / std::min(a.bb.area(), b.bb.area()); + const float ovl = overlap(a.bb(), b.bb()) / std::min(a.bb().area(), b.bb().area()); if (ovl > DollarThreshold) next = objects.erase(next); @@ -485,13 +487,13 @@ void DollarNMS(dvector& objects) static void suppress(int type, std::vector& objects) { - CV_Assert(type == Detector::DOLLAR); + CV_Assert(type == cv::softcascade::Detector::DOLLAR); DollarNMS(objects); } } -void Detector::detectNoRoi(const cv::Mat& image, std::vector& objects) const +void cv::softcascade::Detector::detectNoRoi(const cv::Mat& image, std::vector& objects) const { Fields& fld = *fields; // create integrals @@ -518,7 +520,7 @@ void Detector::detectNoRoi(const cv::Mat& image, std::vector& objects if (rejCriteria != NO_REJECT) suppress(rejCriteria, objects); } -void Detector::detect(cv::InputArray _image, cv::InputArray _rois, std::vector& objects) const +void cv::softcascade::Detector::detect(cv::InputArray _image, cv::InputArray _rois, std::vector& objects) const { // only color images are suppered cv::Mat image = _image.getMat(); @@ -570,7 +572,7 @@ void Detector::detect(cv::InputArray _image, cv::InputArray _rois, std::vector objects; detect( _image, _rois, objects); @@ -588,7 +590,7 @@ void Detector::detect(InputArray _image, InputArray _rois, OutputArray _rects, int i = 0; for (IDet it = objects.begin(); it != objects.end(); ++it, ++i) { - rectPtr[i] = (*it).bb; + rectPtr[i] = (*it).bb(); confPtr[i] = (*it).confidence; } } \ No newline at end of file diff --git a/modules/softcascade/src/soft_cascade_octave.cpp b/modules/softcascade/src/octave.cpp similarity index 100% rename from modules/softcascade/src/soft_cascade_octave.cpp rename to modules/softcascade/src/octave.cpp diff --git a/modules/softcascade/test/test_cuda_softcascade.cpp b/modules/softcascade/test/test_cuda_softcascade.cpp index 139c60856..7787664e4 100644 --- a/modules/softcascade/test/test_cuda_softcascade.cpp +++ b/modules/softcascade/test/test_cuda_softcascade.cpp @@ -76,7 +76,7 @@ TEST(SCascadeTest, readCascade) namespace { - typedef cv::softcascade::SCascade::Detection Detection; + typedef cv::softcascade::Detection Detection; cv::Rect getFromTable(int idx) { @@ -194,7 +194,7 @@ TEST_P(SCascadeTestRoi, Detect) cascade.detect(colored, rois, objectBoxes); cv::Mat dt(objectBoxes); - typedef cv::softcascade::SCascade::Detection Detection; + typedef cv::softcascade::Detection Detection; Detection* dts = ((Detection*)dt.data) + 1; int* count = dt.ptr(0); @@ -262,7 +262,7 @@ TEST_P(SCascadeTestAll, detect) cascade.detect(colored, rois, objectBoxes); - typedef cv::softcascade::SCascade::Detection Detection; + typedef cv::softcascade::Detection Detection; cv::Mat dt(objectBoxes); @@ -303,7 +303,7 @@ TEST_P(SCascadeTestAll, detectStream) cascade.detect(colored, rois, objectBoxes, s); s.waitForCompletion(); - typedef cv::softcascade::SCascade::Detection Detection; + typedef cv::softcascade::Detection Detection; cv::Mat detections(objectBoxes); int a = *(detections.ptr(0)); ASSERT_EQ(a, expected); diff --git a/samples/cpp/peopledetect.cpp b/samples/cpp/peopledetect.cpp index c73735271..fee17897b 100644 --- a/samples/cpp/peopledetect.cpp +++ b/samples/cpp/peopledetect.cpp @@ -139,12 +139,11 @@ int main(int argc, char** argv) std::stringstream conf(std::stringstream::in | std::stringstream::out); conf << d.confidence; - cv::rectangle(frame, cv::Rect(d.bb.x, d.bb.y, d.bb.width, d.bb.height), cv::Scalar(b, 0, 255 - b, 255), 2); - cv::putText(frame, conf.str() , cv::Point(d.bb.x + 10, d.bb.y - 5),1, 1.1, cv::Scalar(25, 133, 255, 0), 1, CV_AA); + cv::rectangle(frame, cv::Rect((int)d.x, (int)d.y, (int)d.w, (int)d.h), cv::Scalar(b, 0, 255 - b, 255), 2); + cv::putText(frame, conf.str() , cv::Point((int)d.x + 10, (int)d.y - 5),1, 1.1, cv::Scalar(25, 133, 255, 0), 1, CV_AA); if (wf) - myfile << d.bb.x << "," << d.bb.y << "," - << d.bb.width << "," << d.bb.height << "," << d.confidence << "\n"; + myfile << d.x << "," << d.y << "," << d.w << "," << d.h << "," << d.confidence << "\n"; } } } diff --git a/samples/gpu/softcascade.cpp b/samples/gpu/softcascade.cpp index 9313a5ab0..acc43af1b 100644 --- a/samples/gpu/softcascade.cpp +++ b/samples/gpu/softcascade.cpp @@ -3,6 +3,8 @@ #include #include +typedef cv::softcascade::Detection Detection; + int main(int argc, char** argv) { const std::string keys = @@ -64,7 +66,7 @@ int main(int argc, char** argv) return 1; } - cv::gpu::GpuMat objects(1, sizeof(SCascade::Detection) * 10000, CV_8UC1); + cv::gpu::GpuMat objects(1, sizeof(Detection) * 10000, CV_8UC1); cv::gpu::printShortCudaDeviceInfo(parser.get("device")); for (;;) { @@ -80,7 +82,6 @@ int main(int argc, char** argv) cascade.detect(dframe, roi, objects); cv::Mat dt(objects); - typedef cv::softcascade::SCascade::Detection Detection; Detection* dts = ((Detection*)dt.data) + 1; int* count = dt.ptr(0);