nagoHok 4 Жалоба Опубликовано July 19, 2011 я изначально конвертирую изображение к градации серого ЗЫ я не спрашиваю как, меня интересует надо ли это делать? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано July 19, 2011 тип данных IPL_DEPTH_8U это unsigned char (8bit U-unsigned) если знаковое, то было бы IPL_DEPTH_8S. Как с unsigned char с ним и надо работать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nagoHok 4 Жалоба Опубликовано August 12, 2011 так, вернулся о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); } } 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nagoHok 4 Жалоба Опубликовано August 16, 2011 Может кто нибудь подскажет алгоритм, как выдилить из всей гисторгаммы следующие скачки (выделил их на рисунке) Я так понимаю это вроде как глобальные максимумы? Спасибо за рание. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано August 16, 2011 это локальные максимумы. найти глобальный максимум, и выделить их задав уровень, например если > 90% от максимума и отстоит от максимума на какое то расcтояние dist, то локальный максимум. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nagoHok 4 Жалоба Опубликовано August 16, 2011 это локальные максимумы. найти глобальный максимум, и выделить их задав уровень, например если > 90% от максимума и отстоит от максимума на какое то расcтояние dist, то локальный максимум. а глобальный максимум это я так понимаю наибольший всплеск на гистограмме? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано August 16, 2011 а глобальный максимум это я так понимаю наибольший всплеск на гистограмме? да. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nagoHok 4 Жалоба Опубликовано August 16, 2011 это локальные максимумы. найти глобальный максимум, и выделить их задав уровень, например если > 90% от максимума и отстоит от максимума на какое то расcтояние dist, то локальный максимум. невсегда бывает корректно, порой глобальный максимум многократно превышает локальные, хотя для начала можно развивать и эту идею. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 16, 2011 Можно попробовать найти среднее и дисперсию, и уровень отсечения установить, скажем, на 2 сигма от среднего. Или установить минимальное количество локальных минимумов и пройти по гистограмме с некоторым шагом пока уровень отсечения не будет пересекать гистограмму заданное кол-во раз. Можно еще смотреть ширину пересечений. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано August 16, 2011 невсегда бывает корректно, порой глобальный максимум многократно превышает локальные, хотя для начала можно развивать и эту идею. ну понятное дело, можете вообще найти все пики и потом обрезать не нужные сверху и снизу. можно исходить из минимального значения на интервале или максимального и отталкиваться от этого, например >0.9*Max или >1.5*Min Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nagoHok 4 Жалоба Опубликовано August 16, 2011 Можно попробовать найти среднее и дисперсию, и уровень отсечения установить, скажем, на 2 сигма от среднего. Или установить минимальное количество локальных минимумов и пройти по гистограмме с некоторым шагом пока уровень отсечения не будет пересекать гистограмму заданное кол-во раз. Можно еще смотреть ширину пересечений. ну среднее - я понял что такое, а вот дисперсия? По точнее можно узнать как её готовить? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 16, 2011 Квадрат среднеквадратического отклонения (посмотрите картинку и все станет ясно): 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 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано August 18, 2011 Можно ещё сгладить гистограмму и найти все значения, которые удовлетворяют условию: x[i-1] < x > x[i+1] Но с дисперсией лучше. P.S. Всем: а вообще, MeanShift не для этого предназначен? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nagoHok 4 Жалоба Опубликовано August 18, 2011 Можно ещё сгладить гистограмму и найти все значения, которые удовлетворяют условию: x[i-1] < x > x[i+1] Но с дисперсией лучше. P.S. Всем: а вообще, MeanShift не для этого предназначен? MeanShift? а можно про него по конкретнее? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nagoHok 4 Жалоба Опубликовано August 23, 2011 Так попробовал срезать значение гистограммы с помощью среднего значения и дисперсии, в принципе результат неплохой, сейчас подошел не посредственно к локализации пластины, что можете посоветовать? Прикладываю 3 картинки, в принципе на изображениях непосредственно от 3 до 5 областей где может находиться номерная пластина, как же выбрать нужную область? Спасибо за рание. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано August 23, 2011 помоему было изначально понятно, что метод с таким же успехом найдет и фару вместо номерного знака. тут можно вводить только ограничения на высоту, ширину номерного знака и сделать такую же гистограмму не только по горизонтали, но и вертикали. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nagoHok 4 Жалоба Опубликовано August 23, 2011 помоему было изначально понятно, что метод с таким же успехом найдет и фару вместо номерного знака. тут можно вводить только ограничения на высоту, ширину номерного знака и сделать такую же гистограмму не только по горизонтали, но и вертикали. хмм, я тут подумал что будет лучше сделать гистограмму для каждого отдельного "блока" вертикальной гистограммы. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
nagoHok 4 Жалоба Опубликовано August 24, 2011 так ну получается примерно следующее Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
DirecTwiX 4 Жалоба Опубликовано September 1, 2011 Наконец-то, я нашёл форум, почти полностью посвященный компьютерному зрению) Сам я недавно познакомился с 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] Написано, что эти значения инварианты относительно множества искажений, но у меня этого не получается (тут как раз я думал про ошибочность использования слепков). Никто не сталкивался с похожей проблемой? Спасибо Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано September 1, 2011 Здесь смотрел? 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано September 1, 2011 что значит по слепкам? дырки в буквах учитываются? в каких случаях не находит? скорее всего у ху моментов будет какая то погрешность это раз. и надо использовать метрику либо нормированную евклидову, либо махалонобиса(вроде даже лучше) это два. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
DirecTwiX 4 Жалоба Опубликовано September 1, 2011 Здесь смотрел? Нет, спасибо. Вечером почитаю. 2mrgloom, на счёт евклидовой метрики думал, когда писал функцию. И вот почему я от неё отказался: если есть инварианты (0.5, 0,5, 11) и (0.5, 0,5, 9), то евклидова метрика выдаст 2, а так как у большинства инвариантов координаты располагаются в [0, 1], то это будет слишком много, хотя в примере инварианты отличаются на ~10%. Сам всё больше склоняюсь к ошибке с использованием слепков. Ведь обычные моменты - это интеграл, и поэтому с использованием слепков, они получаются слишком большие. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано September 1, 2011 на счёт евклидовой метрики думал, когда писал функцию. И вот почему я от неё отказался: если есть инварианты (0.5, 0,5, 11) и (0.5, 0,5, 9), то евклидова метрика выдаст 2, а так как у большинства инвариантов координаты располагаются в [0, 1], то это будет слишком много, хотя в примере инварианты отличаются на ~10%. я же написал нормированную. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
chehov85 1 Жалоба Опубликовано September 1, 2011 Автор, ну так что у Вас получилось можете показать пример и исходник? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
DirecTwiX 4 Жалоба Опубликовано September 1, 2011 я же написал нормированную. Так это же и есть нормированная? корень из суммы квадратов =\ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах