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

Распознавание номерного знака, расп. текста.

Recommended Posts

я изначально конвертирую изображение к градации серого

ЗЫ я не спрашиваю как, меня интересует надо ли это делать?

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


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

тип данных IPL_DEPTH_8U это unsigned char (8bit U-unsigned) если знаковое, то было бы IPL_DEPTH_8S.

Как с unsigned char с ним и надо работать.

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


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

так, вернулся о5 таки к проекту, удалось сгладить полученую функци, но быстродействие оставляет желать лучшего, с тем учотом что еше надо и локализовать область номерного знака а затем попытаться распознать символы

если кому интересна вот реализации сглаживающей функции


inline double GausSmooth(double nDist, double nParam, double nParam2)

{	

	return exp((-(nDist * nDist)/nParam)) / nParam2;	

}


void SmoothFunc1(const CArray<_Line>& arSrc, CArray<_Line>& arDest)

{

	arDest.RemoveAll();


	double nParam = 15.;

	int nAperture = 50;

	double nParam1 = 2* (nParam * nParam);

	double nParam2 = sqrt(2 * CV_PI) * nParam;


	for(int nPosY = 0; nPosY < arSrc.GetCount() - 1; nPosY++)

	{

		_Line line;

		line = arSrc[nPosY];

		for (int nPosX = 0; nPosX < arSrc[nPosY].GetSize() - 1; nPosX++)

		{

			double s = 0.;

			for (int nK = max(nPosX - nAperture, 0); nK < min(arSrc[nPosY].GetSize() - 1, nPosX + nAperture); nK++)

			{

				s += arSrc[nPosY].Get(nK) * GausSmooth(abs(nPosX - nK), nParam1, nParam2);

			}		

			line.SetAt(nPosX, s);

		}

		arDest.Add(line);

	}	

}

  • Like 1

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


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

Может кто нибудь подскажет алгоритм, как выдилить из всей гисторгаммы следующие скачки (выделил их на рисунке)

Я так понимаю это вроде как глобальные максимумы?

Спасибо за рание.

post-1451-0-12624700-1313481075_thumb.jp

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


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

это локальные максимумы.

найти глобальный максимум, и выделить их задав уровень, например если > 90% от максимума и отстоит от максимума на какое то расcтояние dist, то локальный максимум.

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


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

это локальные максимумы.

найти глобальный максимум, и выделить их задав уровень, например если > 90% от максимума и отстоит от максимума на какое то расcтояние dist, то локальный максимум.

а глобальный максимум это я так понимаю наибольший всплеск на гистограмме?

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


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

а глобальный максимум это я так понимаю наибольший всплеск на гистограмме?

да.

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


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

это локальные максимумы.

найти глобальный максимум, и выделить их задав уровень, например если > 90% от максимума и отстоит от максимума на какое то расcтояние dist, то локальный максимум.

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

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


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

Можно попробовать найти среднее и дисперсию, и уровень отсечения установить, скажем, на 2 сигма от среднего.

Или установить минимальное количество локальных минимумов и пройти по гистограмме с некоторым шагом пока уровень отсечения не будет пересекать гистограмму заданное кол-во раз. Можно еще смотреть ширину пересечений.

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


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

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

ну понятное дело, можете вообще найти все пики и потом обрезать не нужные сверху и снизу.

можно исходить из минимального значения на интервале или максимального и отталкиваться от этого, например >0.9*Max или >1.5*Min

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


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

Можно попробовать найти среднее и дисперсию, и уровень отсечения установить, скажем, на 2 сигма от среднего.

Или установить минимальное количество локальных минимумов и пройти по гистограмме с некоторым шагом пока уровень отсечения не будет пересекать гистограмму заданное кол-во раз. Можно еще смотреть ширину пересечений.

ну среднее - я понял что такое, а вот дисперсия? По точнее можно узнать как её готовить?

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


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

Квадрат среднеквадратического отклонения (посмотрите картинку и все станет ясно):

http://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B5%D0%B4%D0%BD%D0%B5%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BE%D1%82%D0%BA%D0%BB%D0%BE%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5

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


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

Можно ещё сгладить гистограмму и найти все значения, которые удовлетворяют условию: x[i-1] < x > x[i+1]

Но с дисперсией лучше.

P.S. Всем: а вообще, MeanShift не для этого предназначен?

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


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

Можно ещё сгладить гистограмму и найти все значения, которые удовлетворяют условию: x[i-1] < x > x[i+1]

Но с дисперсией лучше.

P.S. Всем: а вообще, MeanShift не для этого предназначен?

MeanShift? а можно про него по конкретнее?

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


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

Так попробовал срезать значение гистограммы с помощью среднего значения и дисперсии, в принципе результат неплохой, сейчас подошел не посредственно к локализации пластины, что можете посоветовать?

Прикладываю 3 картинки, в принципе на изображениях непосредственно от 3 до 5 областей где может находиться номерная пластина, как же выбрать нужную область?

Спасибо за рание.

post-1451-0-71043300-1314090231_thumb.jp

post-1451-0-27551800-1314090242_thumb.jp

post-1451-0-27303700-1314090250_thumb.jp

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


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

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

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

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


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

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

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

хмм, я тут подумал что будет лучше сделать гистограмму для каждого отдельного "блока" вертикальной гистограммы.

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


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

Наконец-то, я нашёл форум, почти полностью посвященный компьютерному зрению)

Сам я недавно познакомился с OpenCV (дней 10 назад), но уже прочитал много статей и написал несколько программ (детектор движения, например, был моей давней нереализуемой мечтой... Но с openCV написал его за несколько часов). Сейчас пытаюсь написать распознавание текста с помощью моментов (Hu's invariants), но всё идёт не так гладко, как я предполагал. Он уже почти написан, но некорректно определяет некоторые буквы (выдаёт другие, хотя имеются в базе очень похожие). В этом подозреваю два пункта:

1) Моменты считал по "слепкам" букв, а не по контурам, как было в той статье (там самого распознавание не было, но было показано как считать моменты у контуров)

2) Неправильная формула сравнения по моментам. В неё подаются двое инвариантов Хью (может и не так по-русски будет Hu's invariants), и она считает разницу между ними. Ниже выложу её. На первый взгляд, конечно, громоздко, но там нет ничего сложно. Сумма отклонений каждого из инвариантов с единичными коэффициентами (думаю, что если подобрать другие коэффициенты, то должно работать).

double GetHusDiff(const CvHuMoments &a, const CvHuMoments &

{

	return ((std::abs(a.hu1)+std::abs(b.hu1))?std::abs((a.hu1-b.hu1)/(std::abs(a.hu1)+std::abs(b.hu1))):0)+

	((std::abs(a.hu2)+std::abs(b.hu2))?std::abs((a.hu2-b.hu2)/(std::abs(a.hu2)+std::abs(b.hu2))):0)+

	((std::abs(a.hu3)+std::abs(b.hu3))?std::abs((a.hu3-b.hu3)/(std::abs(a.hu3)+std::abs(b.hu3))):0)+

	((std::abs(a.hu4)+std::abs(b.hu4))?std::abs((a.hu4-b.hu4)/(std::abs(a.hu4)+std::abs(b.hu4))):0)+

	((std::abs(a.hu5)+std::abs(b.hu5))?std::abs((a.hu5-b.hu5)/(std::abs(a.hu5)+std::abs(b.hu5))):0)+

	((std::abs(a.hu6)+std::abs(b.hu6))?std::abs((a.hu6-b.hu6)/(std::abs(a.hu6)+std::abs(b.hu6))):0)+

	((std::abs(a.hu7)+std::abs(b.hu7))?std::abs((a.hu7-b.hu7)/(std::abs(a.hu7)+std::abs(b.hu7))):0);

}[/code]

Написано, что эти значения инварианты относительно множества искажений, но у меня этого не получается (тут как раз я думал про ошибочность использования слепков).

Никто не сталкивался с похожей проблемой?

Спасибо

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


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

что значит по слепкам? дырки в буквах учитываются?

в каких случаях не находит?

скорее всего у ху моментов будет какая то погрешность это раз.

и надо использовать метрику либо нормированную евклидову, либо махалонобиса(вроде даже лучше) это два.

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


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

Здесь смотрел?

Нет, спасибо. Вечером почитаю.

2mrgloom, на счёт евклидовой метрики думал, когда писал функцию. И вот почему я от неё отказался: если есть инварианты (0.5, 0,5, 11) и (0.5, 0,5, 9), то евклидова метрика выдаст 2, а так как у большинства инвариантов координаты располагаются в [0, 1], то это будет слишком много, хотя в примере инварианты отличаются на ~10%.

Сам всё больше склоняюсь к ошибке с использованием слепков. Ведь обычные моменты - это интеграл, и поэтому с использованием слепков, они получаются слишком большие.

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


Ссылка на сообщение
Поделиться на других сайтах
на счёт евклидовой метрики думал, когда писал функцию. И вот почему я от неё отказался: если есть инварианты (0.5, 0,5, 11) и (0.5, 0,5, 9), то евклидова метрика выдаст 2, а так как у большинства инвариантов координаты располагаются в [0, 1], то это будет слишком много, хотя в примере инварианты отличаются на ~10%.

я же написал нормированную.

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


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

Автор, ну так что у Вас получилось можете показать пример и исходник?

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


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

я же написал нормированную.

Так это же и есть нормированная? корень из суммы квадратов =\

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×