From fd4761ba313926b32f1efff5bae75b53170ddc02 Mon Sep 17 00:00:00 2001 From: Suleyman TURKMEN Date: Fri, 18 Sep 2015 11:39:39 +0300 Subject: [PATCH] Update face detection samples --- samples/cpp/facedetect.cpp | 117 +++++++++++--------------- samples/cpp/smiledetect.cpp | 110 ++++++++++-------------- samples/{cpp => tapi}/ufacedetect.cpp | 86 +++++++++---------- 3 files changed, 134 insertions(+), 179 deletions(-) rename samples/{cpp => tapi}/ufacedetect.cpp (80%) diff --git a/samples/cpp/facedetect.cpp b/samples/cpp/facedetect.cpp index 1206245ef..2be4e17e4 100644 --- a/samples/cpp/facedetect.cpp +++ b/samples/cpp/facedetect.cpp @@ -1,17 +1,7 @@ #include "opencv2/objdetect.hpp" -#include "opencv2/imgcodecs.hpp" -#include "opencv2/videoio.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" -#include "opencv2/core/utility.hpp" - -#include "opencv2/videoio/videoio_c.h" -#include "opencv2/highgui/highgui_c.h" - -#include #include -#include -#include using namespace std; using namespace cv; @@ -28,7 +18,7 @@ static void help() " [--try-flip]\n" " [filename|camera_index]\n\n" "see facedetect.cmd for one call:\n" - "./facedetect --cascade=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"../../data/haarcascades/haarcascade_eye.xml\" --scale=1.3\n\n" + "./facedetect --cascade=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml\" --scale=1.3\n\n" "During execution:\n\tHit any key to quit.\n" "\tUsing OpenCV version " << CV_VERSION << "\n" << endl; } @@ -42,8 +32,8 @@ string nestedCascadeName = "../../data/haarcascades/haarcascade_eye_tree_eyeglas int main( int argc, const char** argv ) { - CvCapture* capture = 0; - Mat frame, frameCopy, image; + VideoCapture capture; + Mat frame, image; const string scaleOpt = "--scale="; size_t scaleOptLen = scaleOpt.length(); const string cascadeOpt = "--cascade="; @@ -103,17 +93,17 @@ int main( int argc, const char** argv ) if( inputName.empty() || (isdigit(inputName.c_str()[0]) && inputName.c_str()[1] == '\0') ) { - capture = cvCaptureFromCAM( inputName.empty() ? 0 : inputName.c_str()[0] - '0' ); int c = inputName.empty() ? 0 : inputName.c_str()[0] - '0' ; - if(!capture) cout << "Capture from CAM " << c << " didn't work" << endl; + if(!capture.open(c)) + cout << "Capture from camera #" << c << " didn't work" << endl; } else if( inputName.size() ) { image = imread( inputName, 1 ); if( image.empty() ) { - capture = cvCaptureFromAVI( inputName.c_str() ); - if(!capture) cout << "Capture from AVI didn't work" << endl; + if(!capture.open( inputName )) + cout << "Could not read " << inputName << endl; } } else @@ -122,36 +112,27 @@ int main( int argc, const char** argv ) if(image.empty()) cout << "Couldn't read ../data/lena.jpg" << endl; } - cvNamedWindow( "result", 1 ); - - if( capture ) + if( capture.isOpened() ) { - cout << "In capture ..." << endl; + cout << "Video capturing has been started ..." << endl; + for(;;) { - IplImage* iplImg = cvQueryFrame( capture ); - frame = cv::cvarrToMat(iplImg); + capture >> frame; if( frame.empty() ) break; - if( iplImg->origin == IPL_ORIGIN_TL ) - frame.copyTo( frameCopy ); - else - flip( frame, frameCopy, 0 ); - detectAndDraw( frameCopy, cascade, nestedCascade, scale, tryflip ); + Mat frame1 = frame.clone(); + detectAndDraw( frame1, cascade, nestedCascade, scale, tryflip ); - if( waitKey( 10 ) >= 0 ) - goto _cleanup_; + int c = waitKey(10); + if( c == 27 || c == 'q' || c == 'Q' ) + break; } - - waitKey(0); - -_cleanup_: - cvReleaseCapture( &capture ); } else { - cout << "In image read" << endl; + cout << "Detecting face(s) in " << inputName << endl; if( !image.empty() ) { detectAndDraw( image, cascade, nestedCascade, scale, tryflip ); @@ -190,8 +171,6 @@ _cleanup_: } } - cvDestroyWindow("result"); - return 0; } @@ -199,21 +178,24 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip ) { - int i = 0; double t = 0; vector faces, faces2; - const static Scalar colors[] = { CV_RGB(0,0,255), - CV_RGB(0,128,255), - CV_RGB(0,255,255), - CV_RGB(0,255,0), - CV_RGB(255,128,0), - CV_RGB(255,255,0), - CV_RGB(255,0,0), - CV_RGB(255,0,255)} ; - Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 ); + const static Scalar colors[] = + { + Scalar(255,0,0), + Scalar(255,128,0), + Scalar(255,255,0), + Scalar(0,255,0), + Scalar(0,128,255), + Scalar(0,255,255), + Scalar(0,0,255), + Scalar(255,0,255) + }; + Mat gray, smallImg; cvtColor( img, gray, COLOR_BGR2GRAY ); - resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); + double fx = 1 / scale; + resize( gray, smallImg, Size(), fx, fx, INTER_LINEAR ); equalizeHist( smallImg, smallImg ); t = (double)cvGetTickCount(); @@ -221,8 +203,7 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH - |CASCADE_SCALE_IMAGE - , + |CASCADE_SCALE_IMAGE, Size(30, 30) ); if( tryflip ) { @@ -231,8 +212,7 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH - |CASCADE_SCALE_IMAGE - , + |CASCADE_SCALE_IMAGE, Size(30, 30) ); for( vector::const_iterator r = faces2.begin(); r != faces2.end(); r++ ) { @@ -241,44 +221,45 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade, } t = (double)cvGetTickCount() - t; printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); - for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) + for ( size_t i = 0; i < faces.size(); i++ ) { + Rect r = faces[i]; Mat smallImgROI; vector nestedObjects; Point center; Scalar color = colors[i%8]; int radius; - double aspect_ratio = (double)r->width/r->height; + double aspect_ratio = (double)r.width/r.height; if( 0.75 < aspect_ratio && aspect_ratio < 1.3 ) { - center.x = cvRound((r->x + r->width*0.5)*scale); - center.y = cvRound((r->y + r->height*0.5)*scale); - radius = cvRound((r->width + r->height)*0.25*scale); + center.x = cvRound((r.x + r.width*0.5)*scale); + center.y = cvRound((r.y + r.height*0.5)*scale); + radius = cvRound((r.width + r.height)*0.25*scale); circle( img, center, radius, color, 3, 8, 0 ); } else - rectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)), - cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)), + rectangle( img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)), + cvPoint(cvRound((r.x + r.width-1)*scale), cvRound((r.y + r.height-1)*scale)), color, 3, 8, 0); if( nestedCascade.empty() ) continue; - smallImgROI = smallImg(*r); + smallImgROI = smallImg( r ); nestedCascade.detectMultiScale( smallImgROI, nestedObjects, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH //|CASCADE_DO_CANNY_PRUNING - |CASCADE_SCALE_IMAGE - , + |CASCADE_SCALE_IMAGE, Size(30, 30) ); - for( vector::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ ) + for ( size_t j = 0; j < nestedObjects.size(); j++ ) { - center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale); - center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale); - radius = cvRound((nr->width + nr->height)*0.25*scale); + Rect nr = nestedObjects[j]; + center.x = cvRound((r.x + nr.x + nr.width*0.5)*scale); + center.y = cvRound((r.y + nr.y + nr.height*0.5)*scale); + radius = cvRound((nr.width + nr.height)*0.25*scale); circle( img, center, radius, color, 3, 8, 0 ); } } - cv::imshow( "result", img ); + imshow( "result", img ); } diff --git a/samples/cpp/smiledetect.cpp b/samples/cpp/smiledetect.cpp index 305cdad8d..d15183fb0 100644 --- a/samples/cpp/smiledetect.cpp +++ b/samples/cpp/smiledetect.cpp @@ -1,15 +1,7 @@ #include "opencv2/objdetect.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" -#include "opencv2/core/utility.hpp" - -#include "opencv2/videoio/videoio_c.h" -#include "opencv2/highgui/highgui_c.h" - -#include #include -#include -#include using namespace std; using namespace cv; @@ -36,11 +28,10 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade, string cascadeName = "../../data/haarcascades/haarcascade_frontalface_alt.xml"; string nestedCascadeName = "../../data/haarcascades/haarcascade_smile.xml"; - int main( int argc, const char** argv ) { - CvCapture* capture = 0; - Mat frame, frameCopy, image; + VideoCapture capture; + Mat frame, image; const string scaleOpt = "--scale="; size_t scaleOptLen = scaleOpt.length(); const string cascadeOpt = "--cascade="; @@ -104,44 +95,34 @@ int main( int argc, const char** argv ) if( inputName.empty() || (isdigit(inputName.c_str()[0]) && inputName.c_str()[1] == '\0') ) { - capture = cvCaptureFromCAM( inputName.empty() ? 0 : inputName.c_str()[0] - '0' ); int c = inputName.empty() ? 0 : inputName.c_str()[0] - '0' ; - if(!capture) cout << "Capture from CAM " << c << " didn't work" << endl; + if(!capture.open(c)) + cout << "Capture from camera #" << c << " didn't work" << endl; } else if( inputName.size() ) { - capture = cvCaptureFromAVI( inputName.c_str() ); - if(!capture) cout << "Capture from AVI didn't work" << endl; + if(!capture.open( inputName )) + cout << "Could not read " << inputName << endl; } - cvNamedWindow( "result", 1 ); - - if( capture ) + if( capture.isOpened() ) { - cout << "In capture ..." << endl; + cout << "Video capturing has been started ..." << endl; cout << endl << "NOTE: Smile intensity will only be valid after a first smile has been detected" << endl; for(;;) { - IplImage* iplImg = cvQueryFrame( capture ); - frame = cv::cvarrToMat(iplImg); + capture >> frame; if( frame.empty() ) break; - if( iplImg->origin == IPL_ORIGIN_TL ) - frame.copyTo( frameCopy ); - else - flip( frame, frameCopy, 0 ); - detectAndDraw( frameCopy, cascade, nestedCascade, scale, tryflip ); + Mat frame1 = frame.clone(); + detectAndDraw( frame1, cascade, nestedCascade, scale, tryflip ); - if( waitKey( 10 ) >= 0 ) - goto _cleanup_; + int c = waitKey(10); + if( c == 27 || c == 'q' || c == 'Q' ) + break; } - - waitKey(0); - -_cleanup_: - cvReleaseCapture( &capture ); } else { @@ -150,7 +131,6 @@ _cleanup_: return -1; } - cvDestroyWindow("result"); return 0; } @@ -158,28 +138,31 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip) { - int i = 0; vector faces, faces2; - const static Scalar colors[] = { CV_RGB(0,0,255), - CV_RGB(0,128,255), - CV_RGB(0,255,255), - CV_RGB(0,255,0), - CV_RGB(255,128,0), - CV_RGB(255,255,0), - CV_RGB(255,0,0), - CV_RGB(255,0,255)} ; - Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 ); + const static Scalar colors[] = + { + Scalar(255,0,0), + Scalar(255,128,0), + Scalar(255,255,0), + Scalar(0,255,0), + Scalar(0,128,255), + Scalar(0,255,255), + Scalar(0,0,255), + Scalar(255,0,255) + }; + Mat gray, smallImg; cvtColor( img, gray, COLOR_BGR2GRAY ); - resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); + + double fx = 1 / scale; + resize( gray, smallImg, Size(), fx, fx, INTER_LINEAR ); equalizeHist( smallImg, smallImg ); cascade.detectMultiScale( smallImg, faces, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH - |CASCADE_SCALE_IMAGE - , + |CASCADE_SCALE_IMAGE, Size(30, 30) ); if( tryflip ) { @@ -188,8 +171,7 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH - |CASCADE_SCALE_IMAGE - , + |CASCADE_SCALE_IMAGE, Size(30, 30) ); for( vector::const_iterator r = faces2.begin(); r != faces2.end(); r++ ) { @@ -197,38 +179,38 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade, } } - for( vector::iterator r = faces.begin(); r != faces.end(); r++, i++ ) + for ( size_t i = 0; i < faces.size(); i++ ) { + Rect r = faces[i]; Mat smallImgROI; vector nestedObjects; Point center; Scalar color = colors[i%8]; int radius; - double aspect_ratio = (double)r->width/r->height; + double aspect_ratio = (double)r.width/r.height; if( 0.75 < aspect_ratio && aspect_ratio < 1.3 ) { - center.x = cvRound((r->x + r->width*0.5)*scale); - center.y = cvRound((r->y + r->height*0.5)*scale); - radius = cvRound((r->width + r->height)*0.25*scale); + center.x = cvRound((r.x + r.width*0.5)*scale); + center.y = cvRound((r.y + r.height*0.5)*scale); + radius = cvRound((r.width + r.height)*0.25*scale); circle( img, center, radius, color, 3, 8, 0 ); } else - rectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)), - cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)), + rectangle( img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)), + cvPoint(cvRound((r.x + r.width-1)*scale), cvRound((r.y + r.height-1)*scale)), color, 3, 8, 0); - const int half_height=cvRound((float)r->height/2); - r->y=r->y + half_height; - r->height = half_height; - smallImgROI = smallImg(*r); + const int half_height=cvRound((float)r.height/2); + r.y=r.y + half_height; + r.height = half_height-1; + smallImgROI = smallImg( r ); nestedCascade.detectMultiScale( smallImgROI, nestedObjects, 1.1, 0, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH //|CASCADE_DO_CANNY_PRUNING - |CASCADE_SCALE_IMAGE - , + |CASCADE_SCALE_IMAGE, Size(30, 30) ); // The number of detected neighbors depends on image size (and also illumination, etc.). The @@ -243,9 +225,9 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade, // Draw rectangle on the left side of the image reflecting smile intensity float intensityZeroOne = ((float)smile_neighbors - min_neighbors) / (max_neighbors - min_neighbors + 1); int rect_height = cvRound((float)img.rows * intensityZeroOne); - CvScalar col = CV_RGB((float)255 * intensityZeroOne, 0, 0); + Scalar col = Scalar((float)255 * intensityZeroOne, 0, 0); rectangle(img, cvPoint(0, img.rows), cvPoint(img.cols/10, img.rows - rect_height), col, -1); } - cv::imshow( "result", img ); + imshow( "result", img ); } diff --git a/samples/cpp/ufacedetect.cpp b/samples/tapi/ufacedetect.cpp similarity index 80% rename from samples/cpp/ufacedetect.cpp rename to samples/tapi/ufacedetect.cpp index 1e08b3e71..e3c82a2c6 100644 --- a/samples/cpp/ufacedetect.cpp +++ b/samples/tapi/ufacedetect.cpp @@ -1,15 +1,8 @@ #include "opencv2/objdetect.hpp" -#include "opencv2/imgcodecs.hpp" -#include "opencv2/videoio.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" -#include "opencv2/core/utility.hpp" #include "opencv2/core/ocl.hpp" - -#include #include -#include -#include using namespace std; using namespace cv; @@ -20,13 +13,13 @@ static void help() "This classifier can recognize many kinds of rigid objects, once the appropriate classifier is trained.\n" "It's most known use is for faces.\n" "Usage:\n" - "./facedetect [--cascade= this is the primary trained classifier such as frontal face]\n" + "./ufacedetect [--cascade= this is the primary trained classifier such as frontal face]\n" " [--nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]\n" " [--scale=]\n" " [--try-flip]\n" " [filename|camera_index]\n\n" "see facedetect.cmd for one call:\n" - "./facedetect --cascade=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"../../data/haarcascades/haarcascade_eye.xml\" --scale=1.3\n\n" + "./ufacedetect --cascade=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml\" --scale=1.3\n\n" "During execution:\n\tHit any key to quit.\n" "\tUsing OpenCV version " << CV_VERSION << "\n" << endl; } @@ -76,7 +69,7 @@ int main( int argc, const char** argv ) } else if( scaleOpt.compare( 0, scaleOptLen, argv[i], scaleOptLen ) == 0 ) { - if( !sscanf( argv[i] + scaleOpt.length(), "%lf", &scale ) || scale > 1 ) + if( !sscanf( argv[i] + scaleOpt.length(), "%lf", &scale ) ) scale = 1; cout << " from which we read scale = " << scale << endl; } @@ -87,7 +80,7 @@ int main( int argc, const char** argv ) } else if( argv[i][0] == '-' ) { - cerr << "WARNING: Unknown option %s" << argv[i] << endl; + cerr << "WARNING: Unknown option " << argv[i] << endl; } else inputName = argv[i]; @@ -120,8 +113,6 @@ int main( int argc, const char** argv ) } } - namedWindow( "result", 1 ); - if( capture.isOpened() ) { cout << "Video capturing has been started ..." << endl; @@ -133,7 +124,8 @@ int main( int argc, const char** argv ) detectAndDraw( frame, canvas, cascade, nestedCascade, scale, tryflip ); - if( waitKey( 10 ) >= 0 ) + int c = waitKey(10); + if( c == 27 || c == 'q' || c == 'Q' ) break; } } @@ -183,46 +175,44 @@ int main( int argc, const char** argv ) void detectAndDraw( UMat& img, Mat& canvas, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, - double scale0, bool tryflip ) + double scale, bool tryflip ) { - int i = 0; - double t = 0, scale=1; + double t = 0; vector faces, faces2; const static Scalar colors[] = { - Scalar(0,0,255), - Scalar(0,128,255), - Scalar(0,255,255), - Scalar(0,255,0), + Scalar(255,0,0), Scalar(255,128,0), Scalar(255,255,0), - Scalar(255,0,0), + Scalar(0,255,0), + Scalar(0,128,255), + Scalar(0,255,255), + Scalar(0,0,255), Scalar(255,0,255) }; static UMat gray, smallImg; t = (double)getTickCount(); - resize( img, smallImg, Size(), scale0, scale0, INTER_LINEAR ); - cvtColor( smallImg, gray, COLOR_BGR2GRAY ); - equalizeHist( gray, gray ); + cvtColor( img, gray, COLOR_BGR2GRAY ); + double fx = 1 / scale; + resize( gray, smallImg, Size(), fx, fx, INTER_LINEAR ); + equalizeHist( smallImg, smallImg ); - cascade.detectMultiScale( gray, faces, + cascade.detectMultiScale( smallImg, faces, 1.1, 3, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH - |CASCADE_SCALE_IMAGE - , + |CASCADE_SCALE_IMAGE, Size(30, 30) ); if( tryflip ) { - flip(gray, gray, 1); - cascade.detectMultiScale( gray, faces2, + flip(smallImg, smallImg, 1); + cascade.detectMultiScale( smallImg, faces2, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH - |CASCADE_SCALE_IMAGE - , + |CASCADE_SCALE_IMAGE, Size(30, 30) ); for( vector::const_iterator r = faces2.begin(); r != faces2.end(); r++ ) { @@ -230,7 +220,7 @@ void detectAndDraw( UMat& img, Mat& canvas, CascadeClassifier& cascade, } } t = (double)getTickCount() - t; - smallImg.copyTo(canvas); + img.copyTo(canvas); double fps = getTickFrequency()/t; static double avgfps = 0; @@ -242,41 +232,43 @@ void detectAndDraw( UMat& img, Mat& canvas, CascadeClassifier& cascade, putText(canvas, format("OpenCL: %s, fps: %.1f", ocl::useOpenCL() ? "ON" : "OFF", avgfps), Point(50, 30), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0,255,0), 2); - for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) + for ( size_t i = 0; i < faces.size(); i++ ) { + Rect r = faces[i]; vector nestedObjects; Point center; Scalar color = colors[i%8]; int radius; - double aspect_ratio = (double)r->width/r->height; + double aspect_ratio = (double)r.width/r.height; if( 0.75 < aspect_ratio && aspect_ratio < 1.3 ) { - center.x = cvRound((r->x + r->width*0.5)*scale); - center.y = cvRound((r->y + r->height*0.5)*scale); - radius = cvRound((r->width + r->height)*0.25*scale); + center.x = cvRound((r.x + r.width*0.5)*scale); + center.y = cvRound((r.y + r.height*0.5)*scale); + radius = cvRound((r.width + r.height)*0.25*scale); circle( canvas, center, radius, color, 3, 8, 0 ); } else - rectangle( canvas, Point(cvRound(r->x*scale), cvRound(r->y*scale)), - Point(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)), + rectangle( canvas, Point(cvRound(r.x*scale), cvRound(r.y*scale)), + Point(cvRound((r.x + r.width-1)*scale), cvRound((r.y + r.height-1)*scale)), color, 3, 8, 0); if( nestedCascade.empty() ) continue; - UMat smallImgROI = gray(*r); + UMat smallImgROI = smallImg(r); nestedCascade.detectMultiScale( smallImgROI, nestedObjects, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH //|CASCADE_DO_CANNY_PRUNING - |CASCADE_SCALE_IMAGE - , + |CASCADE_SCALE_IMAGE, Size(30, 30) ); - for( vector::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ ) + + for ( size_t j = 0; j < nestedObjects.size(); j++ ) { - center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale); - center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale); - radius = cvRound((nr->width + nr->height)*0.25*scale); + Rect nr = nestedObjects[j]; + center.x = cvRound((r.x + nr.x + nr.width*0.5)*scale); + center.y = cvRound((r.y + nr.y + nr.height*0.5)*scale); + radius = cvRound((nr.width + nr.height)*0.25*scale); circle( canvas, center, radius, color, 3, 8, 0 ); } }