OpenCV: detectMultiScale () выдает слишком много точек из объекта

Я тренировал свой компьютер с opencv_traincascade в течение всего дня, чтобы обнаружить 2 € монеты, используя более 6000 положительных изображений, подобных следующим:

введите описание изображения здесь

Я только что попытался запустить простую программу OpenCV, чтобы увидеть результаты и проверить файл. cascade.xml, Конечный результат очень разочаровывает:

введите описание изображения здесь

На монете много точек, но есть и много других точек на заднем плане. Может ли быть проблема с моими позитивными изображениями, используемыми для тренировок? Или, может быть, я использую detectMultiScale() с неверными параметрами?

Вот мой код:

#include "opencv2/opencv.hpp"
using namespace cv;

int main(int, char**) {

Mat src = imread("2c.jpg", CV_LOAD_IMAGE_COLOR);

Mat src_gray;

std::vector<cv::Rect> money;

CascadeClassifier euro2_cascade;

cvtColor(src, src_gray, CV_BGR2GRAY );
//equalizeHist(src_gray, src_gray);

if ( !euro2_cascade.load( "/Users/lory/Desktop/cascade.xml" ) ) {
printf("--(!)Error loading\n");
return -1;
}

euro2_cascade.detectMultiScale( src_gray, money, 1.1, 0, CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE, cv::Size(10, 10),cv::Size(2000, 2000) );

for( size_t i = 0; i < money.size(); i++ ) {
cv::Point center( money[i].x + money[i].width*0.5, money[i].y + money[i].height*0.5 );
ellipse( src, center, cv::Size( money[i].width*0.5, money[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
}

//namedWindow( "Display window", WINDOW_AUTOSIZE );
imwrite("result.jpg",src);
}

Я также пытался уменьшить количество соседей, но эффект тот же, только с гораздо меньшим количеством очков … Может ли быть проблемой тот факт, что на позитивных изображениях эти 4 угла являются фоном вокруг монеты? Я сгенерировал png изображения с Gimp из снятого видео, показывающего монету, поэтому я не знаю почему opencv_createsamples ставит эти 4 угла.

3

Решение

Эти позитивные образы просто неправильно

Чем больше «шума» вы дадите своим изображениям в частях обучающих данных, тем более надежными они будут, но да, тем больше времени потребуется для тренировки. Однако именно здесь ваши отрицательные образцы вступят в действие. Если у вас будет как можно больше отрицательных тренировочных выборок с максимально возможным количеством диапазонов, вы создадите более надежные детекторы. Вы должны убедиться, что ваши позитивные изображения содержат только ваши монеты, все ваши негативные изображения имеют все но монеты в них

Я видел пару ваших вопросов до сих пор & Я думаю, что вы хотите обнаружить три разных типа монет евро. Лучше всего тренировать три классификатора на разных монетах, а затем запускать все три на своих изображениях.

Я также думаю, что вам не хватает ключевого знания о том, как HAAR работает (или LBP или что-то еще) эффективно, он создает набор «функций» из ваших положительных изображений, а затем пытается найти эти функции в изображениях, над которыми вы запускаете классификатор. Он создает эти функции, определяя, что отличается между вашими позитивными и негативными изображениями. Вы не хотите ничего, что не будет тем, что вы пытаетесь обнаружить в ваших позитивных образах.

Редактировать 1 — Пример

Представьте себе, что вы создаете классификатор для дорожного знака, который похож на монеты. Это большой, это красный & это гексагонально Создать классификатор для этого относительно просто — если вы не путаете этап обучения с ошибочными данными.

Редактировать 2 — Масштабирование изображений:

Вы также должны помнить, что при запуске этапа обнаружения он берет ваш классификатор и начинает с малого, а затем масштабируется. Большие, очевидные функции будут обнаружены быстрее — в моем предыдущем примере большие красные пятна & гексагональной формы. Затем он будет начинаться с небольших объектов, т. Е. Текста или цифр.

Редактировать 3 — гораздо лучший пример

это Пример очень хорошо показывает, как работает обучение каскадного детектора объектов. На самом деле это даже тот же пример, что и со знаком стоп!

3

Другие решения

Для определения изображения монеты евро вы можете использовать несколько методов:

1) Поезд каскада OpenCV (HAAR или LBP). Не забудьте использовать большое количество ложных изображений. Также увеличьте изображение монеты (добавьте границу).

2) Оцените изображение с помощью градиентов АБС исходного изображения. Используйте Hough Transform, чтобы обнаружить круги (монета имеет форму круга).

1