nhr 0 Жалоба Опубликовано March 26, 2014 Доброго времени суток. Пишу программку для распознования людей в толпе. Как мне кажется самый простой из способов, это использовать функцию HoughCircles. Однако возникает проблема, заключающаяся в том, что программа находит много лишнего. Скажите, как можно минимизировать погрешность и оставить только то, что мне нужно?? Может фильтр какой-нибудь есть? int main(int argc, char* argv[]) { Mat img, gray; img = imread("image1.jpg", CV_LOAD_IMAGE_UNCHANGED); if (img.empty()) { cout << "Error : Image cannot be loaded..!!" << endl; system("pause"); //wait for a key press return -1; } namedWindow("original", CV_WINDOW_AUTOSIZE); imshow("original", img); //рисуем рабочую область ROI-------------------------- Rect roi(93, 4, 400, 400); Mat image_roi = img(roi); //---------------------------------------------------- //градация серого cvtColor(image_roi, gray, CV_BGR2GRAY); Mat blurred,blurred1; //GaussianBlur(gray, blurred, Size(5, 5), 0,0,4);// с размытием хуже //imshow("Smoothed Image", blurred); //резкость------------------------------- double delta = 0; int ddepth = -1; float kernel[9]; // увеличение чёткости kernel[0] = -0.1; kernel[1] = -0.1; kernel[2] = -0.1; kernel[3] = -0.1; kernel[4] = 2; kernel[5] = -0.1; kernel[6] = -0.1; kernel[7] = -0.1; kernel[8] = -0.1; // матрица Mat kernel_matrix = Mat(3, 3, CV_32FC1, kernel); filter2D(gray, blurred, ddepth, kernel_matrix, Point(-1, -1)); //imshow("filter2d", blurred); //-------------------------------------- //поиск кругов-------------------------- vector<Vec3f> circles; HoughCircles(blurred, circles, CV_HOUGH_GRADIENT, 10, // разрешение сумматора, используемое для детектирования центров кругов 30, // минимальная дистанция между двумя кругами 60, // верхнее пороговое значение, передаваемое детектору границ Кенни (нижнее пороговое значение будет в 2 раза меньше) 10, // суммирующее пороговое значение детектированя центров 2, 15); // минимальный и максимальный радиус // пробегаемся по кругам и рисуем их на оригинальном изображении for (size_t i = 0; i < circles.size(); i++) { Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); int radius = cvRound(circles[i][2]); // рисуем центр окружности circle(blurred, center, 3, Scalar(0, 255, 255), -1, CV_AA, 0); // рисуем контур окружности circle(blurred, center, radius, Scalar(0, 255, 255), 3, CV_AA, 0); } // показываем---------------------------------------------------- namedWindow("HoughCircles", 1); imshow("HoughCircles", blurred); waitKey(5000); system("pause"); destroyAllWindows(); return 0; } Ну и пример работы: Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано March 26, 2014 Не хватает сведений. Фото или видео? Если видео, то камера подвижная или нет? Ракуррс всегда примерно такой, как на кадре? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано March 26, 2014 Фото, ракурс всегда одинаковый. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано March 26, 2014 Ребята, ну помогите советом. Я уже и templatemathcing использовал, но с ним только 1:1 можно найти, а если на картинке немного другое изображение то метод не помогает. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 26, 2014 Проблема в нечетко поставленной задаче. Попытайтесь максимально четко определить: 1) Что на входе. (Один снимок, много снимков, день/ночь или только день, доступен ли отдельно фон, качается-ли камера, пешеходы в фуражках? и т.д. ) 2) Что требуется в идеале и в каком виде. 3) Допустимые погрешности. 4) Накладываемые ограничения (время обработки, и т.п. ). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано March 27, 2014 кругами тут явно не отделаться, нужен детектор аля pedestrian detector. в opencv это вроде рамочный детектор detectMultiScale, используя HOG. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано March 27, 2014 1) На входе я использую кадры из видео, т.е. на входе фото. Камера статична. Почти все люди в фуражках. Время суток день 2) В идеале нужно подсчитать количество людей на площади 3) Погрешность как можно меньше, человека 3-4 можно пропустить 4) Ограничений в принципе никаких нет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 28, 2014 Изображение не самое простое для анализа. Если на входе видео последовательность, то можно попробовать вначале разделить картинку на передний и задний план. Посмотрите например https://code.google.com/p/bgslibrary/ для этих целей, ну или какую-нибудь встроенную в opencv вычиталку фона. Затем используя в результат в качестве маски найти яркие точки (фуражки). Можно попробовать блоб-анализ (см. cvBlob или похожие либы), поиск контуров с последующей фильтрацией по площади. Я думаю что окружности искать здесь не самый лучший подход. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано March 28, 2014 кругами тут явно не отделаться, нужен детектор аля pedestrian detector. в opencv это вроде рамочный детектор detectMultiScale, используя HOG. HOG, кстати, тут подойдёт очень хорошо. Если же люди будут в таких белых касках, то лучше HOG обучить самому на них. Или, ещё лучше, обучи ICF detector (integral channels features) на своих данных. Его можно взять из ccv. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
iskees 32 Жалоба Опубликовано March 28, 2014 если еще актуально и если выложите тут пару сотен фотографий то могу попробовать "покрутить" hog. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано March 29, 2014 Актуально и еще как! Фотографии могу выложить без проблем Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 29, 2014 Ну только через файлообменник, если больше нескольких десятков МБ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nhr 0 Жалоба Опубликовано March 30, 2014 https://www.dropbox.com/s/u4x5r1m81g7imz0/2014-03-30-14-09-02.jpg https://www.dropbox.com/s/ry7exxjhncr8rea/2014-03-30-14-09-01.jpg https://www.dropbox.com/s/kn134v8hb92773i/2014-03-30-14-08-45.jpg https://www.dropbox.com/s/atduq50p4cbcw4b/2014-03-30-14-08-50.jpg https://www.dropbox.com/s/cf9y9wjkkd5rsqm/2014-03-30-14-08-57.jpg Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах