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

DirecTwiX

Пользователи
  • Количество публикаций

    47
  • Зарегистрирован

  • Посещение

  • Days Won

    1

Все публикации пользователя DirecTwiX

  1. Вроде как есть оператор at. Но как им пользоваться для 24 (3х8) битной матрицы не пойму.
  2. Сейчас по-быстренькому написал прогу для записи видео с вебки... Вроде работает, но есть небольшие проблемки с fps. Сама камера не говорит, какой у неё фпс (через CV_CAP_PROP_FPS), поэтому я перед включением проги вывожу просто на экран видео в течение двух секунд и считаю фпс. Но мои опасения подтвердились. Это число часто не совпадает с реальным фпс при записи, и было бы логичней сначала записать кадры, а потом назначить фпс (у videoWriter). Можно ли как-то это сделать (без храние лишнего файла/массива)?
  3. Работа с контурами

    http://habrahabr.ru/blogs/image_processing/118486/#b1 Если что, то всё работает) Могу ещё выложить скрин из учебника по дифгему, но думаю в этом нет необходимости)
  4. Работа с контурами

    Yi - это не координата, а i-ый вектор во всём контуре. Это теорема из дифгема... "Если имеется Y касательная к кривой (контур в нашем случае), то длина кривой вычисляется по этой формуле (если заменить сумму на интеграл)". Вот такие пироги)
  5. Работа с контурами

    По логике вещей это сумма длин векторов из которой, но в статейке про контурный анализ написана такая формула: Что это?
  6. Инетересно. Потом почитаю. Спасибо
  7. Работа с контурами

    Нет, говорю же, что исправил. В 2.1 не было поддержки контуров у этой функции.
  8. Спасибо. Это можно сделать как-нибудь по-быстрому? Например с использованием bat-файлов
  9. Работа с контурами

    Чтобы получить следующую точку, нужно к текущей точке прибавить i-й вектор. {(0,1),(1,0),(0,-1),(-1,0)} - квадрат. Потом контуры можно будет скалярно перемножать
  10. Работа с контурами

    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. Заработало
  11. Работа с контурами

    Спасибо. А зачем мне их центровать? Я всё равно собираюсь вектор-контур строить =\ И не понял, зачем мне нужно выравнивать оси.
  12. Работа с контурами

    Если нет готовой функции, то можно просто ткнуть меня в статью про хранение контуров в OpencV... Тут перечитал тему про то, как следует подавать контур нейросетям. Там возник такой же вопрос, но тема после этого умерла =\ Спасибо. П.с. Нечаянно создал такую же тему в нейросетях. Удалить не смог...
  13. Лол... У меня эта формула в первом посте) Вроде бы они все меньше единицы. Поэтому я вытащил метод сравнения из cvMatchShapes. Там сначала моменты п реобразуются как (1/log(hu)) Да... Я наивный поверил чистой теории... И вот во что это вылилось... Если маленько изменить контур, то моменты поменяются координально =\ Сегодня начну писать через скалярное произведение контуров.
  14. Работа с контурами

    Наконец-то я написал "распознаватель" текста с помощью моментов. Работает быстро, точно, но правда тестировал на 15 знаках (вращал текст на угол до 90 градусов). И вот в чём проблема: иногда 6 определяется как 9, а иногда наоборот. Поэтому нужно проверять вращение. Как можно организовать?
  15. Читал я сейчас про распознавание текста и вот на что наткнулся: Наверно, речь идёт о старых версиях библеотеки, потому что в своих исходниках я этого не нашёл=\
  16. Работа с контурами

    На сколько я могу себе это представить, то после Канни, findContours просто найдёт в два раза больше контуров =\
  17. Так это же и есть нормированная? корень из суммы квадратов =\
  18. Нет, спасибо. Вечером почитаю. 2mrgloom, на счёт евклидовой метрики думал, когда писал функцию. И вот почему я от неё отказался: если есть инварианты (0.5, 0,5, 11) и (0.5, 0,5, 9), то евклидова метрика выдаст 2, а так как у большинства инвариантов координаты располагаются в [0, 1], то это будет слишком много, хотя в примере инварианты отличаются на ~10%. Сам всё больше склоняюсь к ошибке с использованием слепков. Ведь обычные моменты - это интеграл, и поэтому с использованием слепков, они получаются слишком большие.
  19. Работа с контурами

    Вот тут на форуме нашёл: 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 были чёрно-белым
  20. Работа с контурами

    В некоторых примерах перед тем как применить cvFindContours, применяют ещё и cvCanny. Какой смысл так делать?
  21. Наконец-то, я нашёл форум, почти полностью посвященный компьютерному зрению) Сам я недавно познакомился с 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] Написано, что эти значения инварианты относительно множества искажений, но у меня этого не получается (тут как раз я думал про ошибочность использования слепков). Никто не сталкивался с похожей проблемой? Спасибо
×