DirecTwiX
-
Количество публикаций
47 -
Зарегистрирован
-
Посещение
-
Days Won
1
Сообщения, опубликованные пользователем DirecTwiX
-
-
http://habrahabr.ru/blogs/image_processing/118486/#b1
Если что, то всё работает)
Могу ещё выложить скрин из учебника по дифгему, но думаю в этом нет необходимости)
-
Yi - это не координата, а i-ый вектор во всём контуре. Это теорема из дифгема... "Если имеется Y касательная к кривой (контур в нашем случае), то длина кривой вычисляется по этой формуле (если заменить сумму на интеграл)". Вот такие пироги)
-
По логике вещей это сумма длин векторов из которой, но в статейке про контурный анализ написана такая формула:
Что это?
-
Инетересно. Потом почитаю. Спасибо
-
возможно там что то такое?
Нет, говорю же, что исправил. В 2.1 не было поддержки контуров у этой функции.
-
Спасибо. Это можно сделать как-нибудь по-быстрому? Например с использованием bat-файлов
-
Что-нибудь можно сделать?
-
что значит вектор контур ? последовательность точек? постоянный ли шаг?
каким методом потом сравниваются контуры?
Чтобы получить следующую точку, нужно к текущей точке прибавить i-й вектор. {(0,1),(1,0),(0,-1),(-1,0)} - квадрат. Потом контуры можно будет скалярно перемножать
-
boundingRect не хочет принимать вектор:
error C2664: 'cv::boundingRect' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'const cv::Mat &'
Хотя в документации написано, что можно либо Mat либо std::vector Вот код:void GetContours(Mat &imgBin, vector<vector<Complexf>> vCntrs, CvSize noiseRect, int adjustTo) { vector<vector<Point>> cntrs, newCntrs; findContours(imgBin, cntrs, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); int s=cntrs.size(); Rect rct; int newSize=0; for (int i=0; i<s; i++) { rct=boundingRect(cntrs[i]); ...
UPD: Обновил 2.1 -> 2.3. Заработало
-
Спасибо.
А зачем мне их центровать? Я всё равно собираюсь вектор-контур строить =\
И не понял, зачем мне нужно выравнивать оси.
-
Если нет готовой функции, то можно просто ткнуть меня в статью про хранение контуров в OpencV...
Тут перечитал тему про то, как следует подавать контур нейросетям. Там возник такой же вопрос, но тема после этого умерла =\
Спасибо.
П.с. Нечаянно создал такую же тему в нейросетях. Удалить не смог...
-
ну я имел ввиду что (abs(H1i-H2i))/(H1i+H2i)
Лол... У меня эта формула в первом посте)
Вроде бы они все меньше единицы. Поэтому я вытащил метод сравнения из cvMatchShapes. Там сначала моменты пИнварианты Ху имеют разную величину. Некоторые примерно равны единице, другие же ближе к 100 или к 100000. В связи с этим обычная Евклидова метрика, нечувствительна к "первым" моментам Ху, поскольку наибольший вклад в метрику дают более большие по модулю компоненты
расстояние Махаланобиса - это такая метрика, при которой компоненты вектора взвешиваются по-разному, обратно пропорционально матрице ковариации http://courses.graphicon.ru/main/vision2009 .
реобразуются как (1/log(hu))
я все таки думаю что ху моменты довольно грубый метод сравнения.(если сравнивать чистые образы то норм наверно ,а если с шумом или как то деформированные то тут должно быть все хуже)
Да... Я наивный поверил чистой теории... И вот во что это вылилось... Если маленько изменить контур, то моменты поменяются координально =\ Сегодня начну писать через скалярное произведение контуров.
-
Наконец-то я написал "распознаватель" текста с помощью моментов. Работает быстро, точно, но правда тестировал на 15 знаках (вращал текст на угол до 90 градусов). И вот в чём проблема: иногда 6 определяется как 9, а иногда наоборот. Поэтому нужно проверять вращение. Как можно организовать?
-
Из файла есть, с камеры есть. А с экрана что-то не нашёл..
- 1
-
Читал я сейчас про распознавание текста и вот на что наткнулся:
Однако, вы наверное заметили, что функция cvMatchShapes не принимает параметры CvHuMoments. Тогда зачем, спрашивается, мы считали параметры с помощью cvGetHuMoments. Да и зачем хранить контуры и изображения, если можно хранить моменты. К счастью, есть открытый исходный код – поэтому меняем код как нам нужноНаверно, речь идёт о старых версиях библеотеки, потому что в своих исходниках я этого не нашёл=\
-
На сколько я могу себе это представить, то после Канни, findContours просто найдёт в два раза больше контуров =\
-
я же написал нормированную.
Так это же и есть нормированная? корень из суммы квадратов =\
-
Здесь смотрел?
Нет, спасибо. Вечером почитаю.
2mrgloom, на счёт евклидовой метрики думал, когда писал функцию. И вот почему я от неё отказался: если есть инварианты (0.5, 0,5, 11) и (0.5, 0,5, 9), то евклидова метрика выдаст 2, а так как у большинства инвариантов координаты располагаются в [0, 1], то это будет слишком много, хотя в примере инварианты отличаются на ~10%.
Сам всё больше склоняюсь к ошибке с использованием слепков. Ведь обычные моменты - это интеграл, и поэтому с использованием слепков, они получаются слишком большие.
-
Вот тут на форуме нашёл:
cvThreshold( gray, gray, 150,255,CV_THRESH_BINARY); // Необходимо удалить белый бордюр cvRectangle(gray, cvPoint(0,0), cvPoint(gray->width-1,gray->height-1),CV_RGB(0,0,0)); // Утолщаем контуры cvDilate( gray, gray, 0, 1 ); // Нах. границы cvCanny( gray, gray, 50, Val1, 5 ); // Нах. контуры cvFindContours( gray, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
Изображение, вроде как, до cvCanny были чёрно-белым
-
В некоторых примерах перед тем как применить cvFindContours, применяют ещё и cvCanny. Какой смысл так делать?
- 1
-
Наконец-то, я нашёл форум, почти полностью посвященный компьютерному зрению)
Сам я недавно познакомился с 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]
Написано, что эти значения инварианты относительно множества искажений, но у меня этого не получается (тут как раз я думал про ошибочность использования слепков).
Никто не сталкивался с похожей проблемой?
Спасибо
Изменить fps у videoWriter после записи
в OpenCV
Опубликовано · Report reply
Сейчас по-быстренькому написал прогу для записи видео с вебки... Вроде работает, но есть небольшие проблемки с fps. Сама камера не говорит, какой у неё фпс (через CV_CAP_PROP_FPS), поэтому я перед включением проги вывожу просто на экран видео в течение двух секунд и считаю фпс. Но мои опасения подтвердились. Это число часто не совпадает с реальным фпс при записи, и было бы логичней сначала записать кадры, а потом назначить фпс (у videoWriter). Можно ли как-то это сделать (без храние лишнего файла/массива)?