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

DirecTwiX

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

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

  • Посещение

  • Days Won

    1

Сообщения, опубликованные пользователем DirecTwiX


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


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


  3. что значит вектор контур ? последовательность точек? постоянный ли шаг?

    каким методом потом сравниваются контуры?

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


  4. 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. Заработало


  5. Если нет готовой функции, то можно просто ткнуть меня в статью про хранение контуров в OpencV...

    Тут перечитал тему про то, как следует подавать контур нейросетям. Там возник такой же вопрос, но тема после этого умерла =\

    Спасибо.

    П.с. Нечаянно создал такую же тему в нейросетях. Удалить не смог...


  6. ну я имел ввиду что (abs(H1i-H2i))/(H1i+H2i)

    Лол... У меня эта формула в первом посте)

    Инварианты Ху имеют разную величину. Некоторые примерно равны единице, другие же ближе к 100 или к 100000. В связи с этим обычная Евклидова метрика, нечувствительна к "первым" моментам Ху, поскольку наибольший вклад в метрику дают более большие по модулю компоненты

    расстояние Махаланобиса - это такая метрика, при которой компоненты вектора взвешиваются по-разному, обратно пропорционально матрице ковариации http://courses.graphicon.ru/main/vision2009 .

    Вроде бы они все меньше единицы. Поэтому я вытащил метод сравнения из cvMatchShapes. Там сначала моменты п

    реобразуются как (1/log(hu))

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

    Да... Я наивный поверил чистой теории... И вот во что это вылилось... Если маленько изменить контур, то моменты поменяются координально =\ Сегодня начну писать через скалярное произведение контуров.


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


  8. Читал я сейчас про распознавание текста и вот на что наткнулся:

    Однако, вы наверное заметили, что функция cvMatchShapes не принимает параметры CvHuMoments. Тогда зачем, спрашивается, мы считали параметры с помощью cvGetHuMoments. Да и зачем хранить контуры и изображения, если можно хранить моменты. К счастью, есть открытый исходный код – поэтому меняем код как нам нужно

    Наверно, речь идёт о старых версиях библеотеки, потому что в своих исходниках я этого не нашёл=\


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

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

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

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


  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 были чёрно-белым


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

    Сам я недавно познакомился с 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]

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

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

    Спасибо

×