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