From bd901eb52d4de71ada993196fadf64102d88a5ff Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Sun, 24 Jun 2012 08:50:03 +0000 Subject: [PATCH] Reverted r8721 and r8725 (issue #2080) --- .../contrib/detection_based_tracker.hpp | 68 +----- .../contrib/src/detection_based_tracker.cpp | 145 +++++++------ .../jni/DetectionBasedTracker_jni.cpp | 202 ++++++------------ .../src/org/opencv/samples/fd/FdActivity.java | 2 +- samples/cpp/CMakeLists.txt | 2 +- samples/cpp/core_vision_tracking_image.cpp | 55 ----- samples/cpp/dbt_face_detection.cpp | 104 --------- .../cpp/detection_based_tracker_sample.cpp | 69 ++---- 8 files changed, 188 insertions(+), 459 deletions(-) delete mode 100644 samples/cpp/core_vision_tracking_image.cpp delete mode 100644 samples/cpp/dbt_face_detection.cpp diff --git a/modules/contrib/include/opencv2/contrib/detection_based_tracker.hpp b/modules/contrib/include/opencv2/contrib/detection_based_tracker.hpp index 239011d227..bef80bfe55 100644 --- a/modules/contrib/include/opencv2/contrib/detection_based_tracker.hpp +++ b/modules/contrib/include/opencv2/contrib/detection_based_tracker.hpp @@ -7,73 +7,22 @@ #include -namespace cv -{ class DetectionBasedTracker { public: struct Parameters { + int minObjectSize; + int maxObjectSize; + double scaleFactor; int maxTrackLifetime; + int minNeighbors; int minDetectionPeriod; //the minimal time between run of the big object detector (on the whole frame) in ms (1000 mean 1 sec), default=0 Parameters(); }; - class IDetector - { - public: - IDetector(): - minObjSize(96, 96), - maxObjSize(INT_MAX, INT_MAX), - minNeighbours(2), - scaleFactor(1.1f) - {} - - virtual void detect(const cv::Mat& Image, std::vector& objects) = 0; - - void setMinObjectSize(const cv::Size& min) - { - minObjSize = min; - } - void setMaxObjectSize(const cv::Size& max) - { - maxObjSize = max; - } - cv::Size getMinObjectSize() const - { - return minObjSize; - } - cv::Size getMaxObjectSize() const - { - return maxObjSize; - } - float getScaleFactor() - { - return scaleFactor; - } - void setScaleFactor(float value) - { - scaleFactor = value; - } - int getMinNeighbours() - { - return minNeighbours; - } - void setMinNeighbours(int value) - { - minNeighbours = value; - } - virtual ~IDetector() {} - - protected: - cv::Size minObjSize; - cv::Size maxObjSize; - int minNeighbours; - float scaleFactor; - }; - - DetectionBasedTracker(cv::Ptr MainDetector, cv::Ptr TrackingDetector, const Parameters& params); + DetectionBasedTracker(const std::string& cascadeFilename, const Parameters& params); virtual ~DetectionBasedTracker(); virtual bool run(); @@ -95,6 +44,7 @@ class DetectionBasedTracker cv::Ptr separateDetectionWork; friend void* workcycleObjectDetectorFunction(void* p); + struct InnerParameters { int numLastPositionsToTrack; @@ -140,11 +90,13 @@ class DetectionBasedTracker std::vector weightsPositionsSmoothing; std::vector weightsSizesSmoothing; - cv::Ptr cascadeForTracking; + cv::CascadeClassifier cascadeForTracking; + void updateTrackedObjects(const std::vector& detectedObjects); cv::Rect calcTrackedObjectPositionToShow(int i) const; void detectInRegion(const cv::Mat& img, const cv::Rect& r, std::vector& detectedObjectsInRegions); }; -} //end of cv namespace + #endif + diff --git a/modules/contrib/src/detection_based_tracker.cpp b/modules/contrib/src/detection_based_tracker.cpp index 9edec6df0a..d65e9d9c3e 100644 --- a/modules/contrib/src/detection_based_tracker.cpp +++ b/modules/contrib/src/detection_based_tracker.cpp @@ -40,7 +40,6 @@ static inline cv::Point2f centerRect(const cv::Rect& r) { return cv::Point2f(r.x+((float)r.width)/2, r.y+((float)r.height)/2); }; - static inline cv::Rect scale_rect(const cv::Rect& r, float scale) { cv::Point2f m=centerRect(r); @@ -52,15 +51,11 @@ static inline cv::Rect scale_rect(const cv::Rect& r, float scale) return cv::Rect(x, y, cvRound(width), cvRound(height)); }; -namespace cv -{ - void* workcycleObjectDetectorFunction(void* p); -} - -class cv::DetectionBasedTracker::SeparateDetectionWork +void* workcycleObjectDetectorFunction(void* p); +class DetectionBasedTracker::SeparateDetectionWork { public: - SeparateDetectionWork(cv::DetectionBasedTracker& _detectionBasedTracker, cv::Ptr _detector); + SeparateDetectionWork(DetectionBasedTracker& _detectionBasedTracker, const std::string& cascadeFilename); virtual ~SeparateDetectionWork(); bool communicateWithDetectingThread(const Mat& imageGray, vector& rectsWhereRegions); bool run(); @@ -82,7 +77,7 @@ class cv::DetectionBasedTracker::SeparateDetectionWork protected: DetectionBasedTracker& detectionBasedTracker; - cv::Ptr cascadeInThread; + cv::CascadeClassifier cascadeInThread; pthread_t second_workthread; pthread_mutex_t mutex; @@ -110,7 +105,7 @@ class cv::DetectionBasedTracker::SeparateDetectionWork long long timeWhenDetectingThreadStartedWork; }; -cv::DetectionBasedTracker::SeparateDetectionWork::SeparateDetectionWork(DetectionBasedTracker& _detectionBasedTracker, cv::Ptr _detector) +DetectionBasedTracker::SeparateDetectionWork::SeparateDetectionWork(DetectionBasedTracker& _detectionBasedTracker, const std::string& cascadeFilename) :detectionBasedTracker(_detectionBasedTracker), cascadeInThread(), isObjectDetectingReady(false), @@ -118,10 +113,9 @@ cv::DetectionBasedTracker::SeparateDetectionWork::SeparateDetectionWork(Detectio stateThread(STATE_THREAD_STOPPED), timeWhenDetectingThreadStartedWork(-1) { - CV_Assert(!_detector.empty()); - - cascadeInThread = _detector; - + if(!cascadeInThread.load(cascadeFilename)) { + CV_Error(CV_StsBadArg, "DetectionBasedTracker::SeparateDetectionWork::SeparateDetectionWork: Cannot load a cascade from the file '"+cascadeFilename+"'"); + } int res=0; res=pthread_mutex_init(&mutex, NULL);//TODO: should be attributes? if (res) { @@ -143,7 +137,7 @@ cv::DetectionBasedTracker::SeparateDetectionWork::SeparateDetectionWork(Detectio } } -cv::DetectionBasedTracker::SeparateDetectionWork::~SeparateDetectionWork() +DetectionBasedTracker::SeparateDetectionWork::~SeparateDetectionWork() { if(stateThread!=STATE_THREAD_STOPPED) { LOGE("\n\n\nATTENTION!!! dangerous algorithm error: destructor DetectionBasedTracker::DetectionBasedTracker::~SeparateDetectionWork is called before stopping the workthread"); @@ -153,7 +147,7 @@ cv::DetectionBasedTracker::SeparateDetectionWork::~SeparateDetectionWork() pthread_cond_destroy(&objectDetectorRun); pthread_mutex_destroy(&mutex); } -bool cv::DetectionBasedTracker::SeparateDetectionWork::run() +bool DetectionBasedTracker::SeparateDetectionWork::run() { LOGD("DetectionBasedTracker::SeparateDetectionWork::run() --- start"); pthread_mutex_lock(&mutex); @@ -202,18 +196,18 @@ do { } while(0) #endif -void* cv::workcycleObjectDetectorFunction(void* p) +void* workcycleObjectDetectorFunction(void* p) { - CATCH_ALL_AND_LOG({ ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->workcycleObjectDetector(); }); + CATCH_ALL_AND_LOG({ ((DetectionBasedTracker::SeparateDetectionWork*)p)->workcycleObjectDetector(); }); try{ - ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->stateThread = cv::DetectionBasedTracker::SeparateDetectionWork::STATE_THREAD_STOPPED; + ((DetectionBasedTracker::SeparateDetectionWork*)p)->stateThread=DetectionBasedTracker::SeparateDetectionWork::STATE_THREAD_STOPPED; } catch(...) { LOGE0("DetectionBasedTracker: workcycleObjectDetectorFunction: ERROR concerning pointer, received as the function parameter"); } return NULL; } -void cv::DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector() +void DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector() { static double freq = getTickFrequency(); LOGD0("DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector() --- start"); @@ -280,17 +274,20 @@ void cv::DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector() int64 t1_detect=getTickCount(); - cascadeInThread->detect(imageSeparateDetecting, objects); + int minObjectSize=detectionBasedTracker.parameters.minObjectSize; + Size min_objectSize=Size(minObjectSize, minObjectSize); + + int maxObjectSize=detectionBasedTracker.parameters.maxObjectSize; + Size max_objectSize(maxObjectSize, maxObjectSize); - /*cascadeInThread.detectMultiScale( imageSeparateDetecting, objects, + + cascadeInThread.detectMultiScale( imageSeparateDetecting, objects, detectionBasedTracker.parameters.scaleFactor, detectionBasedTracker.parameters.minNeighbors, 0 |CV_HAAR_SCALE_IMAGE , min_objectSize, max_objectSize ); - */ - LOGD("DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector() --- end handling imageSeparateDetecting"); if (!isWorking()) { @@ -336,7 +333,7 @@ void cv::DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector() LOGI("DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector: Returning"); } -void cv::DetectionBasedTracker::SeparateDetectionWork::stop() +void DetectionBasedTracker::SeparateDetectionWork::stop() { //FIXME: TODO: should add quickStop functionality pthread_mutex_lock(&mutex); @@ -353,7 +350,7 @@ void cv::DetectionBasedTracker::SeparateDetectionWork::stop() pthread_mutex_unlock(&mutex); } -void cv::DetectionBasedTracker::SeparateDetectionWork::resetTracking() +void DetectionBasedTracker::SeparateDetectionWork::resetTracking() { LOGD("DetectionBasedTracker::SeparateDetectionWork::resetTracking"); pthread_mutex_lock(&mutex); @@ -374,7 +371,7 @@ void cv::DetectionBasedTracker::SeparateDetectionWork::resetTracking() } -bool cv::DetectionBasedTracker::SeparateDetectionWork::communicateWithDetectingThread(const Mat& imageGray, vector& rectsWhereRegions) +bool DetectionBasedTracker::SeparateDetectionWork::communicateWithDetectingThread(const Mat& imageGray, vector& rectsWhereRegions) { static double freq = getTickFrequency(); @@ -423,13 +420,19 @@ bool cv::DetectionBasedTracker::SeparateDetectionWork::communicateWithDetectingT return shouldHandleResult; } -cv::DetectionBasedTracker::Parameters::Parameters() +DetectionBasedTracker::Parameters::Parameters() { + minObjectSize=96; + maxObjectSize=INT_MAX; + scaleFactor=1.1; maxTrackLifetime=5; + minNeighbors=2; minDetectionPeriod=0; } -cv::DetectionBasedTracker::InnerParameters::InnerParameters() + + +DetectionBasedTracker::InnerParameters::InnerParameters() { numLastPositionsToTrack=4; numStepsToWaitBeforeFirstShow=6; @@ -441,32 +444,39 @@ cv::DetectionBasedTracker::InnerParameters::InnerParameters() coeffObjectSpeedUsingInPrediction=0.8; } - -cv::DetectionBasedTracker::DetectionBasedTracker(cv::Ptr MainDetector, cv::Ptr TrackingDetector, const Parameters& params) +DetectionBasedTracker::DetectionBasedTracker(const std::string& cascadeFilename, const Parameters& params) :separateDetectionWork(), - parameters(params), innerParameters(), - numTrackedSteps(0), - cascadeForTracking(TrackingDetector) + numTrackedSteps(0) { - CV_Assert( (params.maxTrackLifetime >= 0) - && (!MainDetector.empty()) - && (!TrackingDetector.empty()) ); + CV_Assert( (params.minObjectSize > 0) + && (params.maxObjectSize >= 0) + && (params.scaleFactor > 1.0) + && (params.maxTrackLifetime >= 0) ); + + if (!cascadeForTracking.load(cascadeFilename)) { + CV_Error(CV_StsBadArg, "DetectionBasedTracker::DetectionBasedTracker: Cannot load a cascade from the file '"+cascadeFilename+"'"); + } - separateDetectionWork = new SeparateDetectionWork(*this, MainDetector); + parameters=params; + + separateDetectionWork=new SeparateDetectionWork(*this, cascadeFilename); weightsPositionsSmoothing.push_back(1); weightsSizesSmoothing.push_back(0.5); weightsSizesSmoothing.push_back(0.3); weightsSizesSmoothing.push_back(0.2); -} -cv::DetectionBasedTracker::~DetectionBasedTracker() +} +DetectionBasedTracker::~DetectionBasedTracker() { } + + void DetectionBasedTracker::process(const Mat& imageGray) { + CV_Assert(imageGray.type()==CV_8UC1); if (!separateDetectionWork->isWorking()) { @@ -484,9 +494,15 @@ void DetectionBasedTracker::process(const Mat& imageGray) Mat imageDetect=imageGray; + int D=parameters.minObjectSize; + if (D < 1) + D=1; + vector rectsWhereRegions; bool shouldHandleResult=separateDetectionWork->communicateWithDetectingThread(imageGray, rectsWhereRegions); + + if (shouldHandleResult) { LOGD("DetectionBasedTracker::process: get _rectsWhereRegions were got from resultDetect"); } else { @@ -501,6 +517,7 @@ void DetectionBasedTracker::process(const Mat& imageGray) continue; } + //correction by speed of rectangle if (n > 1) { Point2f center=centerRect(r); @@ -530,7 +547,7 @@ void DetectionBasedTracker::process(const Mat& imageGray) updateTrackedObjects(detectedObjectsInRegions); } -void cv::DetectionBasedTracker::getObjects(std::vector& result) const +void DetectionBasedTracker::getObjects(std::vector& result) const { result.clear(); @@ -543,8 +560,7 @@ void cv::DetectionBasedTracker::getObjects(std::vector& result) const LOGD("DetectionBasedTracker::process: found a object with SIZE %d x %d, rect={%d, %d, %d x %d}", r.width, r.height, r.x, r.y, r.width, r.height); } } - -void cv::DetectionBasedTracker::getObjects(std::vector& result) const +void DetectionBasedTracker::getObjects(std::vector& result) const { result.clear(); @@ -558,23 +574,25 @@ void cv::DetectionBasedTracker::getObjects(std::vector& result) const } } -bool cv::DetectionBasedTracker::run() + + +bool DetectionBasedTracker::run() { return separateDetectionWork->run(); } -void cv::DetectionBasedTracker::stop() +void DetectionBasedTracker::stop() { separateDetectionWork->stop(); } -void cv::DetectionBasedTracker::resetTracking() +void DetectionBasedTracker::resetTracking() { separateDetectionWork->resetTracking(); trackedObjects.clear(); } -void cv::DetectionBasedTracker::updateTrackedObjects(const vector& detectedObjects) +void DetectionBasedTracker::updateTrackedObjects(const vector& detectedObjects) { enum { NEW_RECTANGLE=-1, @@ -693,8 +711,7 @@ void cv::DetectionBasedTracker::updateTrackedObjects(const vector& detecte } } } - -Rect cv::DetectionBasedTracker::calcTrackedObjectPositionToShow(int i) const +Rect DetectionBasedTracker::calcTrackedObjectPositionToShow(int i) const { if ( (i < 0) || (i >= (int)trackedObjects.size()) ) { LOGE("DetectionBasedTracker::calcTrackedObjectPositionToShow: ERROR: wrong i=%d", i); @@ -726,8 +743,8 @@ Rect cv::DetectionBasedTracker::calcTrackedObjectPositionToShow(int i) const double sum=0; for(int j=0; j < Nsize; j++) { int k=N-j-1; - w += lastPositions[k].width * weightsSizesSmoothing[j]; - h += lastPositions[k].height * weightsSizesSmoothing[j]; + w+= lastPositions[k].width * weightsSizesSmoothing[j]; + h+= lastPositions[k].height * weightsSizesSmoothing[j]; sum+=weightsSizesSmoothing[j]; } w /= sum; @@ -745,7 +762,7 @@ Rect cv::DetectionBasedTracker::calcTrackedObjectPositionToShow(int i) const Point br(lastPositions[k].br()); Point2f c1; c1=tl; - c1=c1* 0.5f; + c1=c1* 0.5f; Point2f c2; c2=br; c2=c2*0.5f; @@ -775,7 +792,7 @@ Rect cv::DetectionBasedTracker::calcTrackedObjectPositionToShow(int i) const return res; } -void cv::DetectionBasedTracker::detectInRegion(const Mat& img, const Rect& r, vector& detectedObjectsInRegions) +void DetectionBasedTracker::detectInRegion(const Mat& img, const Rect& r, vector& detectedObjectsInRegions) { Rect r0(Point(), img.size()); Rect r1=scale_rect(r, innerParameters.coeffTrackingWindowSize); @@ -785,7 +802,8 @@ void cv::DetectionBasedTracker::detectInRegion(const Mat& img, const Rect& r, ve return; } - int d = cvRound(std::min(r.width, r.height) * innerParameters.coeffObjectSizeToTrack); + int d=std::min(r.width, r.height); + d=cvRound(d * innerParameters.coeffObjectSizeToTrack); vector tmpobjects; @@ -793,17 +811,17 @@ void cv::DetectionBasedTracker::detectInRegion(const Mat& img, const Rect& r, ve LOGD("DetectionBasedTracker::detectInRegion: img1.size()=%d x %d, d=%d", img1.size().width, img1.size().height, d); - cascadeForTracking->setMinObjectSize(Size(d, d)); - cascadeForTracking->detect(img1, tmpobjects); - /* - detectMultiScale( img1, tmpobjects, + int maxObjectSize=parameters.maxObjectSize; + Size max_objectSize(maxObjectSize, maxObjectSize); + + cascadeForTracking.detectMultiScale( img1, tmpobjects, parameters.scaleFactor, parameters.minNeighbors, 0 |CV_HAAR_FIND_BIGGEST_OBJECT |CV_HAAR_SCALE_IMAGE , Size(d,d), max_objectSize - );*/ + ); for(size_t i=0; i < tmpobjects.size(); i++) { Rect curres(tmpobjects[i].tl() + r1.tl(), tmpobjects[i].size()); @@ -811,9 +829,12 @@ void cv::DetectionBasedTracker::detectInRegion(const Mat& img, const Rect& r, ve } } -bool cv::DetectionBasedTracker::setParameters(const Parameters& params) +bool DetectionBasedTracker::setParameters(const Parameters& params) { - if ( params.maxTrackLifetime < 0 ) + if ( (params.minObjectSize <= 0) + || (params.maxObjectSize < 0) + || (params.scaleFactor <= 1.0) + || (params.maxTrackLifetime < 0) ) { LOGE("DetectionBasedTracker::setParameters: ERROR: wrong parameters value"); return false; @@ -825,7 +846,7 @@ bool cv::DetectionBasedTracker::setParameters(const Parameters& params) return true; } -const cv::DetectionBasedTracker::Parameters& DetectionBasedTracker::getParameters() +const DetectionBasedTracker::Parameters& DetectionBasedTracker::getParameters() { return parameters; } diff --git a/samples/android/face-detection/jni/DetectionBasedTracker_jni.cpp b/samples/android/face-detection/jni/DetectionBasedTracker_jni.cpp index b4c224c9d8..9f45a60dda 100644 --- a/samples/android/face-detection/jni/DetectionBasedTracker_jni.cpp +++ b/samples/android/face-detection/jni/DetectionBasedTracker_jni.cpp @@ -18,53 +18,6 @@ inline void vector_Rect_to_Mat(vector& v_rect, Mat& mat) mat = Mat(v_rect, true); } -class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector -{ -public: - CascadeDetectorAdapter(cv::Ptr detector): - IDetector(), - Detector(detector) - { - LOGD("CascadeDetectorAdapter::Detect::Detect"); - CV_Assert(!detector.empty()); - } - - void detect(const cv::Mat &Image, std::vector &objects) - { - LOGD("CascadeDetectorAdapter::Detect: begin"); - LOGD("CascadeDetectorAdapter::Detect: scaleFactor=%.2f, minNeighbours=%d, minObjSize=(%dx%d), maxObjSize=(%dx%d)", scaleFactor, minNeighbours, minObjSize.width, minObjSize.height, maxObjSize.width, maxObjSize.height); - Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize); - LOGD("CascadeDetectorAdapter::Detect: end"); - } - - virtual ~CascadeDetectorAdapter() - { - LOGD("CascadeDetectorAdapter::Detect::~Detect"); - } - -private: - CascadeDetectorAdapter(); - cv::Ptr Detector; -}; - -struct DetectorAgregator -{ - cv::Ptr mainDetector; - cv::Ptr trackingDetector; - - cv::Ptr tracker; - DetectorAgregator(cv::Ptr& _mainDetector, cv::Ptr& _trackingDetector): - mainDetector(_mainDetector), - trackingDetector(_trackingDetector) - { - CV_Assert(!_mainDetector.empty()); - CV_Assert(!_trackingDetector.empty()); - - DetectionBasedTracker::Parameters DetectorParams; - tracker = new DetectionBasedTracker(mainDetector.ptr(), trackingDetector.ptr(), DetectorParams); - } -}; - JNIEXPORT jlong JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeCreateObject (JNIEnv * jenv, jclass, jstring jFileName, jint faceSize) { @@ -72,33 +25,27 @@ JNIEXPORT jlong JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeC string stdFileName(jnamestr); jlong result = 0; - LOGD("Java_org_opencv_samples_fd_DetectionBasedTracker_nativeCreateObject"); - try { - cv::Ptr mainDetector = new CascadeDetectorAdapter(new CascadeClassifier(stdFileName)); - cv::Ptr trackingDetector = new CascadeDetectorAdapter(new CascadeClassifier(stdFileName)); - result = (jlong)new DetectorAgregator(mainDetector, trackingDetector); - if (faceSize > 0) - { - mainDetector->setMinObjectSize(Size(faceSize, faceSize)); - //trackingDetector->setMinObjectSize(Size(faceSize, faceSize)); - } + DetectionBasedTracker::Parameters DetectorParams; + if (faceSize > 0) + DetectorParams.minObjectSize = faceSize; + result = (jlong)new DetectionBasedTracker(stdFileName, DetectorParams); } catch(cv::Exception e) { - LOGD("nativeCreateObject catched cv::Exception: %s", e.what()); - jclass je = jenv->FindClass("org/opencv/core/CvException"); - if(!je) - je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, e.what()); + LOGD("nativeCreateObject catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); } catch (...) { - LOGD("nativeCreateObject catched unknown exception"); - jclass je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, "Unknown exception in JNI code {Java_org_opencv_samples_fd_DetectionBasedTracker_nativeCreateObject(...)}"); - return 0; + LOGD("nativeCreateObject catched unknown exception"); + jclass je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}"); + return 0; } return result; @@ -107,135 +54,126 @@ JNIEXPORT jlong JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeC JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDestroyObject (JNIEnv * jenv, jclass, jlong thiz) { - LOGD("Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDestroyObject"); - try { - ((DetectorAgregator*)thiz)->tracker->stop(); - delete (DetectorAgregator*)thiz; + ((DetectionBasedTracker*)thiz)->stop(); + delete (DetectionBasedTracker*)thiz; } catch(cv::Exception e) { - LOGD("nativeestroyObject catched cv::Exception: %s", e.what()); - jclass je = jenv->FindClass("org/opencv/core/CvException"); - if(!je) - je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, e.what()); + LOGD("nativeestroyObject catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); } catch (...) { - LOGD("nativeDestroyObject catched unknown exception"); - jclass je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, "Unknown exception in JNI code {Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDestroyObject(...)}"); + LOGD("nativeDestroyObject catched unknown exception"); + jclass je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}"); } } JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeStart (JNIEnv * jenv, jclass, jlong thiz) { - LOGD("Java_org_opencv_samples_fd_DetectionBasedTracker_nativeStart"); - try { - ((DetectorAgregator*)thiz)->tracker->run(); + ((DetectionBasedTracker*)thiz)->run(); } catch(cv::Exception e) { - LOGD("nativeStart catched cv::Exception: %s", e.what()); - jclass je = jenv->FindClass("org/opencv/core/CvException"); - if(!je) - je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, e.what()); + LOGD("nativeStart catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); } catch (...) { - LOGD("nativeStart catched unknown exception"); - jclass je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, "Unknown exception in JNI code {Java_org_opencv_samples_fd_DetectionBasedTracker_nativeStart(...)}"); + LOGD("nativeStart catched unknown exception"); + jclass je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}"); } } JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeStop (JNIEnv * jenv, jclass, jlong thiz) { - LOGD("Java_org_opencv_samples_fd_DetectionBasedTracker_nativeStop"); - try { - ((DetectorAgregator*)thiz)->tracker->stop(); + ((DetectionBasedTracker*)thiz)->stop(); } catch(cv::Exception e) { - LOGD("nativeStop catched cv::Exception: %s", e.what()); - jclass je = jenv->FindClass("org/opencv/core/CvException"); - if(!je) - je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, e.what()); + LOGD("nativeStop catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); } catch (...) { - LOGD("nativeStop catched unknown exception"); - jclass je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, "Unknown exception in JNI code {Java_org_opencv_samples_fd_DetectionBasedTracker_nativeStop(...)}"); + LOGD("nativeStop catched unknown exception"); + jclass je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}"); } } JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeSetFaceSize (JNIEnv * jenv, jclass, jlong thiz, jint faceSize) { - LOGD("Java_org_opencv_samples_fd_DetectionBasedTracker_nativeSetFaceSize -- BEGIN"); - try { - if (faceSize > 0) - { - ((DetectorAgregator*)thiz)->mainDetector->setMinObjectSize(Size(faceSize, faceSize)); - //((DetectorAgregator*)thiz)->trackingDetector->setMinObjectSize(Size(faceSize, faceSize)); - } + if (faceSize > 0) + { + DetectionBasedTracker::Parameters DetectorParams = \ + ((DetectionBasedTracker*)thiz)->getParameters(); + DetectorParams.minObjectSize = faceSize; + ((DetectionBasedTracker*)thiz)->setParameters(DetectorParams); + } + } catch(cv::Exception e) { - LOGD("nativeStop catched cv::Exception: %s", e.what()); - jclass je = jenv->FindClass("org/opencv/core/CvException"); - if(!je) - je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, e.what()); + LOGD("nativeStop catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); } catch (...) { - LOGD("nativeSetFaceSize catched unknown exception"); - jclass je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, "Unknown exception in JNI code {Java_org_opencv_samples_fd_DetectionBasedTracker_nativeSetFaceSize(...)}"); + LOGD("nativeSetFaceSize catched unknown exception"); + jclass je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}"); } - LOGD("Java_org_opencv_samples_fd_DetectionBasedTracker_nativeSetFaceSize -- END"); } JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDetect (JNIEnv * jenv, jclass, jlong thiz, jlong imageGray, jlong faces) { - LOGD("Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDetect"); - try { - vector RectFaces; - ((DetectorAgregator*)thiz)->tracker->process(*((Mat*)imageGray)); - ((DetectorAgregator*)thiz)->tracker->getObjects(RectFaces); - *((Mat*)faces) = Mat(RectFaces, true); + vector RectFaces; + ((DetectionBasedTracker*)thiz)->process(*((Mat*)imageGray)); + ((DetectionBasedTracker*)thiz)->getObjects(RectFaces); + vector_Rect_to_Mat(RectFaces, *((Mat*)faces)); } catch(cv::Exception e) { - LOGD("nativeCreateObject catched cv::Exception: %s", e.what()); - jclass je = jenv->FindClass("org/opencv/core/CvException"); - if(!je) - je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, e.what()); + LOGD("nativeCreateObject catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); } catch (...) { - LOGD("nativeDetect catched unknown exception"); - jclass je = jenv->FindClass("java/lang/Exception"); - jenv->ThrowNew(je, "Unknown exception in JNI code {Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDetect(...)}"); + LOGD("nativeDetect catched unknown exception"); + jclass je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}"); } - LOGD("Java_org_opencv_samples_fd_DetectionBasedTracker_nativeDetect END"); -} +} \ No newline at end of file diff --git a/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java b/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java index 118bf559e8..5494000bb5 100644 --- a/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java +++ b/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java @@ -91,7 +91,7 @@ public class FdActivity extends Activity { ad.setMessage("Fatal error: can't open camera!"); ad.setButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); + dialog.dismiss(); finish(); } }); diff --git a/samples/cpp/CMakeLists.txt b/samples/cpp/CMakeLists.txt index a0e03fdfcb..3f4bb6aa0c 100644 --- a/samples/cpp/CMakeLists.txt +++ b/samples/cpp/CMakeLists.txt @@ -3,7 +3,7 @@ # # ---------------------------------------------------------------------------- -SET(OPENCV_CPP_SAMPLES_REQUIRED_DEPS opencv_core_vision_api opencv_core opencv_flann opencv_imgproc +SET(OPENCV_CPP_SAMPLES_REQUIRED_DEPS opencv_core opencv_flann opencv_imgproc opencv_highgui opencv_ml opencv_video opencv_objdetect opencv_photo opencv_nonfree opencv_features2d opencv_calib3d opencv_legacy opencv_contrib opencv_stitching opencv_videostab) diff --git a/samples/cpp/core_vision_tracking_image.cpp b/samples/cpp/core_vision_tracking_image.cpp deleted file mode 100644 index 9de13efbc8..0000000000 --- a/samples/cpp/core_vision_tracking_image.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include // Basic OpenCV structures (cv::Mat, Scalar) -#include // OpenCV window I/O -#include - -#include -#include -#include - -using namespace std; -using namespace cv; - -const string WindowName = "Face Detection example"; -const Scalar RectColor = CV_RGB(0,255,0); - -int main() -{ - namedWindow(WindowName); - cv::moveWindow(WindowName, 100, 100); - - Mat Viewport; - Mat ReferenceFrame = imread("board.jpg"); - if (ReferenceFrame.empty()) - { - printf("Error: Cannot load input image\n"); - return 1; - } - - cv::Ptr tracker = nv::Algorithm::create("nv::Tracker::OpticalFlow"); - - tracker->initialize(); - - // First frame for initialization - tracker->feed(ReferenceFrame); - - nv::Tracker::TrackedObjectHandler obj = tracker->addObject(cv::Rect(100,100, 200, 200)); - - while(true) - { - tracker->feed(ReferenceFrame); - - if (obj->getStatus() == nv::Tracker::LOST_STATUS) - break; - - cv::Rect currentLocation = obj->getLocation(); - - ReferenceFrame.copyTo(Viewport); - rectangle(Viewport, currentLocation, RectColor); - - imshow(WindowName, Viewport); - - if (cvWaitKey(30) >= 0) break; - } - - return 0; -} diff --git a/samples/cpp/dbt_face_detection.cpp b/samples/cpp/dbt_face_detection.cpp deleted file mode 100644 index 7a19e30625..0000000000 --- a/samples/cpp/dbt_face_detection.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#if 0 //defined(__linux__) || defined(LINUX) || defined(__APPLE__) || defined(ANDROID) - -#include // Gaussian Blur -#include // Basic OpenCV structures (cv::Mat, Scalar) -#include // OpenCV window I/O -#include -#include - -#include -#include -#include - -using namespace std; -using namespace cv; - -const string WindowName = "Face Detection example"; - -class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector -{ - public: - CascadeDetectorAdapter(cv::Ptr detector): - IDetector(), - Detector(detector) - { - CV_Assert(!detector.empty()); - } - - void detect(const cv::Mat &Image, std::vector &objects) - { - Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize); - } - - virtual ~CascadeDetectorAdapter() - {} - - private: - CascadeDetectorAdapter(); - cv::Ptr Detector; - }; - -int main(int argc, char* argv[]) -{ - namedWindow(WindowName); - - VideoCapture VideoStream(0); - - if (!VideoStream.isOpened()) - { - printf("Error: Cannot open video stream from camera\n"); - return 1; - } - - std::string cascadeFrontalfilename = "../../data/lbpcascades/lbpcascade_frontalface.xml"; - cv::Ptr cascade = new cv::CascadeClassifier(cascadeFrontalfilename); - cv::Ptr MainDetector = new CascadeDetectorAdapter(cascade); - - cascade = new cv::CascadeClassifier(cascadeFrontalfilename); - cv::Ptr TrackingDetector = new CascadeDetectorAdapter(cascade); - - DetectionBasedTracker::Parameters params; - DetectionBasedTracker Detector(MainDetector, TrackingDetector, params); - - if (!Detector.run()) - { - printf("Error: Detector initialization failed\n"); - return 2; - } - - Mat ReferenceFrame; - Mat GrayFrame; - vector Faces; - - while(true) - { - VideoStream >> ReferenceFrame; - cvtColor(ReferenceFrame, GrayFrame, COLOR_RGB2GRAY); - Detector.process(GrayFrame); - Detector.getObjects(Faces); - - for (size_t i = 0; i < Faces.size(); i++) - { - rectangle(ReferenceFrame, Faces[i], CV_RGB(0,255,0)); - } - - imshow(WindowName, ReferenceFrame); - - if (cvWaitKey(30) >= 0) break; - } - - Detector.stop(); - - return 0; -} - -#else - -#include -int main() -{ - printf("This sample works for UNIX or ANDROID only\n"); - return 0; -} - -#endif diff --git a/samples/cpp/detection_based_tracker_sample.cpp b/samples/cpp/detection_based_tracker_sample.cpp index 61106f3a9c..6aeb1b2454 100644 --- a/samples/cpp/detection_based_tracker_sample.cpp +++ b/samples/cpp/detection_based_tracker_sample.cpp @@ -43,6 +43,8 @@ #define LOGE(...) do{} while(0) #endif + + using namespace cv; using namespace std; @@ -61,31 +63,9 @@ static void usage() LOGE0("\t (e.g.\"opencv/data/lbpcascades/lbpcascade_frontalface.xml\" "); } -class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector -{ - public: - CascadeDetectorAdapter(cv::Ptr detector): - Detector(detector) - { - CV_Assert(!detector.empty()); - } - - void detect(const cv::Mat &Image, std::vector &objects) - { - Detector->detectMultiScale(Image, objects, 1.1, 3, 0, minObjSize, maxObjSize); - } - virtual ~CascadeDetectorAdapter() - {} - - private: - CascadeDetectorAdapter(); - cv::Ptr Detector; - }; - static int test_FaceDetector(int argc, char *argv[]) { - if (argc < 4) - { + if (argc < 4) { usage(); return -1; } @@ -100,14 +80,12 @@ static int test_FaceDetector(int argc, char *argv[]) vector images; { char filename[256]; - for(int n=1; ; n++) - { + for(int n=1; ; n++) { snprintf(filename, sizeof(filename), filepattern, n); LOGD("filename='%s'", filename); Mat m0; m0=imread(filename); - if (m0.empty()) - { + if (m0.empty()) { LOGI0("Cannot read the file --- break"); break; } @@ -116,15 +94,10 @@ static int test_FaceDetector(int argc, char *argv[]) LOGD("read %d images", (int)images.size()); } + DetectionBasedTracker::Parameters params; std::string cascadeFrontalfilename=cascadefile; - cv::Ptr cascade = new cv::CascadeClassifier(cascadeFrontalfilename); - cv::Ptr MainDetector = new CascadeDetectorAdapter(cascade); - - cascade = new cv::CascadeClassifier(cascadeFrontalfilename); - cv::Ptr TrackingDetector = new CascadeDetectorAdapter(cascade); - DetectionBasedTracker::Parameters params; - DetectionBasedTracker fd(MainDetector, TrackingDetector, params); + DetectionBasedTracker fd(cascadeFrontalfilename, params); fd.run(); @@ -135,13 +108,12 @@ static int test_FaceDetector(int argc, char *argv[]) double freq=getTickFrequency(); int num_images=images.size(); - for(int n=1; n <= num_images; n++) - { + for(int n=1; n <= num_images; n++) { int64 tcur=getTickCount(); int64 dt=tcur-tprev; tprev=tcur; double t_ms=((double)dt)/freq * 1000.0; - LOGD("\n\nSTEP n=%d from prev step %f ms\n", n, t_ms); + LOGD("\n\nSTEP n=%d from prev step %f ms\n\n", n, t_ms); m=images[n-1]; CV_Assert(! m.empty()); cvtColor(m, gray, CV_BGR2GRAY); @@ -151,8 +123,11 @@ static int test_FaceDetector(int argc, char *argv[]) vector result; fd.getObjects(result); - for(size_t i=0; i < result.size(); i++) - { + + + + + for(size_t i=0; i < result.size(); i++) { Rect r=result[i]; CV_Assert(r.area() > 0); Point tl=r.tl(); @@ -161,14 +136,14 @@ static int test_FaceDetector(int argc, char *argv[]) rectangle(m, tl, br, color, 3); } } - - char outfilename[256]; - for(int n=1; n <= num_images; n++) { - snprintf(outfilename, sizeof(outfilename), outfilepattern, n); - LOGD("outfilename='%s'", outfilename); - m=images[n-1]; - imwrite(outfilename, m); + char outfilename[256]; + for(int n=1; n <= num_images; n++) { + snprintf(outfilename, sizeof(outfilename), outfilepattern, n); + LOGD("outfilename='%s'", outfilename); + m=images[n-1]; + imwrite(outfilename, m); + } } fd.stop(); @@ -176,6 +151,8 @@ static int test_FaceDetector(int argc, char *argv[]) return 0; } + + int main(int argc, char *argv[]) { return test_FaceDetector(argc, argv);