Подтвердить что ты не робот

Рекомендуемые значения для параметров OpenCV detectMultiScale()

Каковы рекомендуемые параметры для CascadeClassifier::detectMultiScale() и в зависимости от каких факторов я должен изменить параметры по умолчанию?

void CascadeClassifier::detectMultiScale(
    const Mat& image, 
    vector<Rect>& objects, 
    double scaleFactor=1.1,
    int minNeighbors=3, 
    int flags=0, 
    Size minSize=Size(),
    Size maxSize=Size() )
4b9b3361

Ответ 1

Среди этих параметров вам нужно уделять больше внимания четырем из них:

  • scaleFactor - параметр, определяющий размер изображения при каждой шкале изображения.

    В основном масштабный коэффициент используется для создания вашей масштабной пирамиды. Дополнительное объяснение можно найти здесь. Короче говоря, как описано здесь, ваша модель имеет фиксированный размер, определенный во время обучения, что видно в xml. Это означает, что этот размер лица обнаружен на изображении, если он присутствует. Однако, перемасштабируя входное изображение, вы можете изменить размер более крупного лица на меньший, сделав его детектируемым по алгоритму.

    1.05 - это хорошее возможное значение для этого, что означает, что вы используете небольшой шаг для изменения размера, то есть уменьшите размер на 5%, вы увеличите вероятность совпадения размера с моделью для обнаружено обнаружение. Это также означает, что алгоритм работает медленнее, поскольку он более тщателен. Вы можете увеличить его до 1,4 для более быстрого обнаружения, рискуя вообще потерять некоторые лица.

  • minNeighbors. Параметр, определяющий, сколько соседей должен иметь каждый прямоугольник-кандидат.

    Этот параметр влияет на качество обнаруженных лиц. Более высокое значение приводит к меньшему количеству обнаружений, но с более высоким качеством. 3~6 - хорошее значение для него.

  • minSize - Минимальный возможный размер объекта. Объекты, меньшие, чем они игнорируются.

    Этот параметр определяет, как малый размер вы хотите обнаружить. Вы это решаете! Обычно [30, 30] является хорошим началом для обнаружения лиц.

  • maxSize - Максимально возможный размер объекта. Объекты, большие, чем это, игнорируются.

    Этот параметр определяет, как большой размер вы хотите обнаружить. Опять же, вы это решаете! Обычно вам не нужно устанавливать его вручную, значение по умолчанию предполагает, что вы хотите обнаружить без верхнего предела размера лица.

Ответ 2

cl_int err;
    cl_uint numPlatforms;

    err = clGetPlatformIDs(0, NULL, &numPlatforms);
    if (CL_SUCCESS == err)
    printf("\nDetected OpenCL platforms: %d", numPlatforms);
    else
    printf("\nError calling clGetPlatformIDs. Error code: %d", err);

    string str ="haarcascade_frontalface_alt2.xml";
    ocl::OclCascadeClassifier fd;
    fd.load(str);
    ocl::oclMat frame, frameGray;
    Mat frameCpu;


    CvVideoCapture vcap = openVideo("0");
    vcap.set(CV_CAP_PROP_FRAME_WIDTH,320);
    vcap.set(CV_CAP_PROP_FRAME_HEIGHT,240);

    static const cv::Size maxSize;

    for(;;){
    //  // processing loop
        vector<Rect> faces;
    vcap >> frameCpu;
    frame = frameCpu;
    ocl::cvtColor(frame, frameGray, CV_BGR2GRAY);
    //ocl::equalizeHist(frameGray, frameGray);
    //Mat mm(frameGray);
    //cvWaitKey(100);

    fd.detectMultiScale(frameGray,faces,1.05,3,0|CV_HAAR_FIND_BIGGEST_OBJECT ,minSize,maxSize);


      for(int   i=0; i<  faces.size() ; i++)
       {
         if(faces.size())
         //circle(img, Point(palm[i].x+ palm[i].width/2,palm[i].y+palm[i].height/2),palm[i].width,Scalar(255,0,0), 2,8 );       
             cv::rectangle(frameCpu, faces[i],Scalar(255,0,0), 2,8 );       
       }

      imshow("fsfs",frameCpu);

    cvWaitKey(1);

Ответ 3

Если у вас хорошая производительность процессора и оперативной памяти или больше, вы можете установить scaleFactor = 1 minNeighbors = 3

Если вы работаете во встроенной системе, например, в малине, я рекомендую выбрать smth like scaleFactor = 2, (более высокие значения означают меньшую точность) minNeighbors = 1, (более высокие значения означают меньшую точность, но большую надежность) алгоритм будет работать намного быстрее, иначе он замерзнет, ​​если производительность процессора и оперативная память недостаточны.

надеюсь, что это поможет