Перейти к содержимому
Compvision.ru
nhr

поиск объектов, используя HoughCircles

Recommended Posts

Доброго времени суток.

Пишу программку для распознования людей в толпе. Как мне кажется самый простой из способов, это использовать функцию 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;

}

Ну и пример работы:

post-6878-0-22471600-1395831168_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не хватает сведений.

Фото или видео? Если видео, то камера подвижная или нет? Ракуррс всегда примерно такой, как на кадре?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ребята, ну помогите советом. Я уже и templatemathcing использовал, но с ним только 1:1 можно найти, а если на картинке немного другое изображение то метод не помогает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проблема в нечетко поставленной задаче.

Попытайтесь максимально четко определить:

1) Что на входе. (Один снимок, много снимков, день/ночь или только день, доступен ли отдельно фон, качается-ли камера, пешеходы в фуражках? :) и т.д. )

2) Что требуется в идеале и в каком виде.

3) Допустимые погрешности.

4) Накладываемые ограничения (время обработки, и т.п. ).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

кругами тут явно не отделаться, нужен детектор аля pedestrian detector.

в opencv это вроде рамочный детектор detectMultiScale, используя HOG.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1) На входе я использую кадры из видео, т.е. на входе фото. Камера статична. Почти все люди в фуражках. Время суток день

2) В идеале нужно подсчитать количество людей на площади

3) Погрешность как можно меньше, человека 3-4 можно пропустить

4) Ограничений в принципе никаких нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Изображение не самое простое для анализа.

Если на входе видео последовательность, то можно попробовать вначале разделить картинку на передний и задний план. Посмотрите например https://code.google.com/p/bgslibrary/ для этих целей, ну или какую-нибудь встроенную в opencv вычиталку фона. Затем используя в результат в качестве маски найти яркие точки (фуражки). Можно попробовать блоб-анализ (см. cvBlob или похожие либы), поиск контуров с последующей фильтрацией по площади.

Я думаю что окружности искать здесь не самый лучший подход.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

кругами тут явно не отделаться, нужен детектор аля pedestrian detector.

в opencv это вроде рамочный детектор detectMultiScale, используя HOG.

HOG, кстати, тут подойдёт очень хорошо. Если же люди будут в таких белых касках, то лучше HOG обучить самому на них. Или, ещё лучше, обучи ICF detector (integral channels features) на своих данных. Его можно взять из ccv.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

если еще актуально и если выложите тут пару сотен фотографий то могу попробовать "покрутить" hog.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Актуально и еще как! Фотографии могу выложить без проблем

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну только через файлообменник, если больше нескольких десятков МБ :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×