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

Nuzhny

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

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

  • Посещение

  • Days Won

    176

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

  1. Как прикрутить OpenCV к билдеру?

    Найти концы легко: берёшь начало (front) и конец (back) каждого списка и находишь ближайшее (евклидово расстояние) начало или конец другого.
  2. Как прикрутить OpenCV к билдеру?

    "Элементарное изображение" обрабатывается быстро и без проблем. Может, ты путь неправильно прописал. Что говорит отладчик об ошибке? В какой строке? Изображение с изолиниями обрабатывается очень медленно. Нужна оптимизация.
  3. Как прикрутить OpenCV к билдеру?

    Что за ошибка в студии? На скриншоте ничего нет. И выложи своё изображение с разрывными линиями.
  4. DirectX (Direct3D или Direct2D), OpenGL. Шейдеры, если придётся.
  5. По поводу скорости рисования беспокоиться не стоит. Если прижмёт - переходи на профессиональную графику. Для изменения размеров окна надо почитать о параметрах функции cvNamedWindow
  6. Проблемы с ExtractSURF() и CvMemStorage

    Запустил стандартный пример с твоими изображениями "find_obj.exe object.jpg image.jpg" - соответствия между дескрипторами находятся верно.
  7. Как прикрутить OpenCV к билдеру?

    Я майкрософтовской студией пользуюсь, так как ей и OpenCV компилирую. Удобно отлаживать.
  8. Проблемы с ExtractSURF() и CvMemStorage

    Можешь выложить свой последний вариант кода с вычислением матрицы гомографии?
  9. Как прикрутить OpenCV к билдеру?

    Набросал на скорую руку программу на создание связных серий (треков) - посмотри: #include <list> #include <highgui.h> #include <cv.h> //////////////////////////////////////////////////////////////////////////// typedef std::list<CvPoint> points_cont; typedef std::list<points_cont> tracks_cont; //////////////////////////////////////////////////////////////////////////// // Находятся ли две точки рядом друг с другом bool is_near(const CvPoint &p1, const CvPoint &p2) { return (abs(p1.x - p2.x) < 2) && (abs(p1.y - p2.y) < 2); } //////////////////////////////////////////////////////////////////////////// // Добавление точек в массив связных треков void add_to_track(tracks_cont &tracks, const CvPoint &p) { // Проверка на принадлежность точки существующей серии bool find_track = false; for (tracks_cont::iterator it = tracks.begin(); it != tracks.end(); ++it) { if (is_near(it->front(), p)) { it->push_front(p); find_track = true; break; } if (is_near(it->back(), p)) { it->push_back(p); find_track = true; break; } } // Если серия не найдена, то создаём новую if (!find_track) { points_cont new_track; new_track.push_back(p); tracks.push_back(new_track); } else { // Если точка найдена, то пробуем объединить соприкасающиеся серии for (tracks_cont::iterator it1 = tracks.begin(); it1 != tracks.end(); ++it1) { tracks_cont::iterator it2 = it1; for (++it2; it2 != tracks.end() { if (is_near(it1->front(), it2->front())) { for (points_cont::iterator it_p = it2->begin(); it_p != it2->end(); ++it_p) { it1->push_front(*it_p); } it2 = tracks.erase(it2); continue; } if (is_near(it1->front(), it2->back())) { for (points_cont::reverse_iterator it_p = it2->rbegin(); it_p != it2->rend(); ++it_p) { it1->push_front(*it_p); } it2 = tracks.erase(it2); continue; } if (is_near(it1->back(), it2->front())) { for (points_cont::iterator it_p = it2->begin(); it_p != it2->end(); ++it_p) { it1->push_back(*it_p); } it2 = tracks.erase(it2); continue; } if (is_near(it1->back(), it2->back())) { for (points_cont::reverse_iterator it_p = it2->rbegin(); it_p != it2->rend(); ++it_p) { it1->push_back(*it_p); } it2 = tracks.erase(it2); continue; } ++it2; } } } } //////////////////////////////////////////////////////////////////////////// int _tmain(int argc, _TCHAR* argv[]) { IplImage* img = cvLoadImage("f:\\break_lines.png", 0); cvShowImage("img", img); // Создание массивов связных точек tracks_cont tracks; unsigned char* pbuf = (unsigned char *)img->imageData; for (int y = 0; y < img->height; ++y) { for (int x = 0; x < img->width; ++x) { if (*pbuf == 0) add_to_track(tracks, cvPoint(x, y)); ++pbuf; } pbuf += (img->widthStep - img->width); } IplImage* second_img = cvCreateImage(cvGetSize(img), 8, 1); cvSet(second_img, cvScalar(255)); // Вывод итоговых серий for (tracks_cont::iterator it1 = tracks.begin(); it1 != tracks.end() { if (it1->size() == 1) it1 = tracks.erase(it1); else ++it1; } for (tracks_cont::iterator it1 = tracks.begin(); it1 != tracks.end(); ++it1) { for (points_cont::iterator it2 = it1->begin(); it2 != it1->end(); ++it2) { (second_img->imageData + it2->y * second_img->widthStep + it2->x)[0] = 0; cvShowImage("second_img", second_img); if (cvWaitKey(40) > 0) break; } } cvReleaseImage(&second_img); cvReleaseImage(&img); cvDestroyAllWindows(); return 0; } ////////////////////////////////////////////////////////////////////////////[/code] Никаких оптимизаций и проверок, времени нет. По-хорошему, сейчас надо определить какая серия каким концом относится к другой серии с другим концом. А после фильтром Кальмана восстановить пропущенные точки.
  10. Работа с камерами

    А какую плату? bt-878? Поищи драйвера Ускова, возможно с ними и прокатит. Но не уверен.
  11. Недавно обсуждалось определение положение зрачка.
  12. Что именно не получилось?
  13. По кадровая перезапись видео

    Думаю, что нет. Да и вообще, представь себе этот процесс. Если видео сжато каким-нибудь кодеком, то каждый кадр будет отличаться по размеру от предыдущего и покадровая перезапись приведёт с необходимости сдвига на диске всего ролика (!) на каждом кадре (!). Не уверен, что тебе нужно такое счастье.
  14. О, спасибо за ссылки. Самым подходящим выглядит tesseract. Скомпилированная программа с базой символов распознаёт мой текст очень хорошо. И скомпилировать удалось. Похоже, то что надо. А есть личные впечатления от использования какой-нибудь библиотеки?
  15. Распознавание по цветам

    Задача очень похожа на работу с изображениями зданий. Ты не пробовал искать прямые с помощью преобразования Хафа?
  16. Как прикрутить OpenCV к билдеру?

    Ну, раз изображение бинарное и состоит из одних линий, то можно попиксельно читать и получить цепочку значений. Тут ничего сложного. А после уже искать, конец какой цепочки подходит к концу другой. Далее фильтр Кальмана - примеры на форуме есть. На каком этапе ты остановился?
  17. Реально. Но необходимо хорошее освещение.
  18. Создаёшь его через cvCreateImage и копируешь из цветного через cvCvtColor
  19. Как прикрутить OpenCV к билдеру?

    У тебя есть только изображение или массив с координатами точек тоже имеется?
  20. Всё просто: в функцию FoundMotion надо подавать одноканальное серое изображения, а ты подаёшь цветное. Текст ошибки об этом и говорит.
  21. Я бы запустил VTune и посмотрел конкретно, что тормозит. Если не хочется покупать, то можно скачать бесплатную месячную версию.
  22. Пересмотрел исходники и... Знаешь, а ты прав. А я что-то попутал. Действительно, cvSetImageROI не делает ничего страшного - выделяет 20 байт и всё. Я точно помню, что ещё давно менял связку cvSetImageROI + cvCopyImage + cvResetImageROI на простую memcpy участка изображения и код ускорился в разы. Мне показалось, что проблемы были как раз в cvSetImageROI. Значит, тормоза были в cvCopyImage. Ввожу тут всех в заблуждение своим невежеством.
  23. Абсолютной точности добиться не получится. Хотя... Попробуй анализировать не всё изображение, а только вертикальную центральную часть. Что-то вроде: cvSetImageROI(frame, cvRect(frame->width / 4, 0, frame->width / 2, frame->height)); // Тут поиск шаблонов... cvResetImageROI(frame); Да, будет гораздо точнее.
  24. Попробовал стандартный пример из OpenCV с motion templates - достаточно правильно определяется движение руки. А в чём конкретно проблема?
×