2014-11-03 2 views
0

У меня есть программа OpenCV, использующая несколько классификаторов Хаара для обнаружения нескольких объектов в одном окне. Первый объект обнаружен, и эллипс нарисован, как и следовало ожидать, когда обнаружены два вторичных объекта, круг не нарисован для каждого обнаруженного им экземпляра (я выводю на консоль при обнаружении объекта).OpenCV обнаруживает несколько объектов в одном окне - не нарисован

Я с указанием трех классификаторов, как так:

String cascade_name = "frontalface.xml"; 
    String nestcascade_name = "body.xml"; 
    String nested_cascade_name_two = "HandCascade.xml"; 

Я затем загрузки классификаторов с помощью:

cascade_one.load(cascade_name) 
cascade_two.load(nested_cascade_name) 
cascade_three.load(nested_cascade_name_two) 

Я затем создать три вектора для трех объектов:

std::vector<Rect> firstObject; 
    std::vector<Rect> secondObject; 
    std::vector<Rect> thirdObject; 

Затем я использую следующий код для обнаружения и рисования объектов на экране:

cascade_one.detectMultiScale(frame_gray, firstObject, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30)); 
    for(size_t i = 0; i < firstObject.size(); i++) { 
    Point center(firstObject[i].x + firstObject[i].width*0.5, firstObject[i].y + firstObject[i].height*0.5); 
    ellipse(frame, center, Size(firstObject[i].width*0.5, firstObject[i].height*0.5), 0, 0, 360, Scalar(0, 255, 0), 4, 8, 0); //GREEN 
    std::cout << " " << cascade_name << " " << timeFound() << endl; 
    } 

Изменение cascade_onefirstObject и cascade_name с соответствующими именами для каждого объекта. Почему первый объект работает отлично, а второй и третий выводят множественные обнаружения, несмотря на то, что они не рисуют все на экране?

EDIT:

Полное обнаружение и сделать код:

void detectAndDisplay(Mat frame) { 
    std::vector<Rect> firstObject; 
    std::vector<Rect> secondObject; 
    std::vector<Rect> thirdObject; 
    Mat frame_gray; 
    cvtColor(frame, frame_gray, CV_BGR2GRAY); 
    equalizeHist(frame_gray, frame_gray); 
    //-- Detect object 
    cascade_one.detectMultiScale(frame_gray, firstObject, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30)); 
    for(size_t i = 0; i < firstObject.size(); i++) { 
    Point center(firstObject[i].x + firstObject[i].width*0.5, firstObject[i].y + firstObject[i].height*0.5); 
    ellipse(frame, center, Size(firstObject[i].width*0.5, firstObject[i].height*0.5), 0, 0, 360, Scalar(0, 255, 0), 4, 8, 0); //GREEN 
    std::cout << " " << cascade_name << " " << timeFound() << endl; 
    } 
    //-- detect second object 
    cascade_two.detectMultiScale(frame_gray, secondObject, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30)); 
    for(size_t k = 0; k < secondObject.size(); k++) { 

     Point center(secondObject[k].x + secondObject[k].x + secondObject[k].width*0.5, secondObject[k].y + secondObject[k].y + secondObject[k].height*0.5); 
     int radius = cvRound((secondObject[k].width + secondObject[k].height)*0.25); 
     circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0); //BLUE 
     std::cout << " " << nested_cascade_name << " " << timeFound() << endl; 
    } 
    //-- detect third object 
    cascade_three.detectMultiScale(frame_gray, thirdObject, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30)); 

    for(size_t j = 0; j < thirdObject.size(); j++) { 
     Point center(thirdObject[j].x + thirdObject[j].x + thirdObject[j].width*0.5, thirdObject[j].y + thirdObject[j].y + thirdObject[j].height*0.5); 
     int radius = cvRound((thirdObject[j].width + thirdObject[j].height)*0.25); 
     circle(frame, center, radius, Scalar(0, 0, 255), 4, 8, 0); //RED 
     std::cout << " " << nested_cascade_name_two << " " << timeFound() << endl; 
    } 
    imshow(window_name, frame); 
    } 
+0

Сколько элементов в векторах secondObject и thirdObject? Не могли бы вы также отправить код для их рисования? Если он не работает, все равно может быть ошибка в коде. Или еще лучше: полный код всех трех шагов обнаружения и шагов рисования. – Micka

+0

Я включил полный код обнаружения и рисования в свой вопрос в качестве редактирования. – Colin747

+0

Есть ли обнаруженные 2-й или 3-й объекты и просто не нарисованы или нет никаких обнаружений? – Micka

ответ

0

ваша проблема возникает при чтении/интерпретации обнаруженных объектов позиции:

Point center(firstObject[i].x + firstObject[i].width*0.5, firstObject[i].y + firstObject[i].height*0.5); 

в то время как это работает отлично, вы сделал небольшую ошибку при интерпретации второго и третьего объектов:

Point center(secondObject[k].x + secondObject[k].x + secondObject[k].width*0.5, secondObject[k].y + secondObject[k].y + secondObject[k].height*0.5); 

, где secondObject [k] .x + secondObject [k] .x может «перемещать» обнаруженный объект из вашего изображения и не имеет большого смысла, если вы хотите отобразить объект в том месте, где оно было обнаружено.

Если заменить линию на

Point center(secondObject[k].x + secondObject[k].width*0.5, secondObject[k].y + secondObject[k].y + secondObject[k].height*0.5); 

и (для третьего детектора):

Point center(thirdObject[j].x + thirdObject[j].width*0.5, thirdObject[j].y + thirdObject[j].y + thirdObject[j].height*0.5); 

все должно быть хорошо.

Смежные вопросы