-
Количество публикаций
1 427 -
Зарегистрирован
-
Посещение
-
Days Won
176
Все публикации пользователя Nuzhny
-
Найти концы легко: берёшь начало (front) и конец (back) каждого списка и находишь ближайшее (евклидово расстояние) начало или конец другого.
-
"Элементарное изображение" обрабатывается быстро и без проблем. Может, ты путь неправильно прописал. Что говорит отладчик об ошибке? В какой строке? Изображение с изолиниями обрабатывается очень медленно. Нужна оптимизация.
-
Что за ошибка в студии? На скриншоте ничего нет. И выложи своё изображение с разрывными линиями.
-
DirectX (Direct3D или Direct2D), OpenGL. Шейдеры, если придётся.
-
По поводу скорости рисования беспокоиться не стоит. Если прижмёт - переходи на профессиональную графику. Для изменения размеров окна надо почитать о параметрах функции cvNamedWindow
-
Запустил стандартный пример с твоими изображениями "find_obj.exe object.jpg image.jpg" - соответствия между дескрипторами находятся верно.
-
cvErode
-
Я майкрософтовской студией пользуюсь, так как ей и 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] Никаких оптимизаций и проверок, времени нет. По-хорошему, сейчас надо определить какая серия каким концом относится к другой серии с другим концом. А после фильтром Кальмана восстановить пропущенные точки.
-
А какую плату? bt-878? Поищи драйвера Ускова, возможно с ними и прокатит. Но не уверен.
-
Недавно обсуждалось определение положение зрачка.
-
Что именно не получилось?
-
Думаю, что нет. Да и вообще, представь себе этот процесс. Если видео сжато каким-нибудь кодеком, то каждый кадр будет отличаться по размеру от предыдущего и покадровая перезапись приведёт с необходимости сдвига на диске всего ролика (!) на каждом кадре (!). Не уверен, что тебе нужно такое счастье.
-
О, спасибо за ссылки. Самым подходящим выглядит tesseract. Скомпилированная программа с базой символов распознаёт мой текст очень хорошо. И скомпилировать удалось. Похоже, то что надо. А есть личные впечатления от использования какой-нибудь библиотеки?
-
Задача очень похожа на работу с изображениями зданий. Ты не пробовал искать прямые с помощью преобразования Хафа?
-
Ну, раз изображение бинарное и состоит из одних линий, то можно попиксельно читать и получить цепочку значений. Тут ничего сложного. А после уже искать, конец какой цепочки подходит к концу другой. Далее фильтр Кальмана - примеры на форуме есть. На каком этапе ты остановился?
-
Реально. Но необходимо хорошее освещение.
-
Создаёшь его через cvCreateImage и копируешь из цветного через cvCvtColor
-
У тебя есть только изображение или массив с координатами точек тоже имеется?
-
Всё просто: в функцию FoundMotion надо подавать одноканальное серое изображения, а ты подаёшь цветное. Текст ошибки об этом и говорит.
-
Я бы запустил VTune и посмотрел конкретно, что тормозит. Если не хочется покупать, то можно скачать бесплатную месячную версию.
-
Пересмотрел исходники и... Знаешь, а ты прав. А я что-то попутал. Действительно, cvSetImageROI не делает ничего страшного - выделяет 20 байт и всё. Я точно помню, что ещё давно менял связку cvSetImageROI + cvCopyImage + cvResetImageROI на простую memcpy участка изображения и код ускорился в разы. Мне показалось, что проблемы были как раз в cvSetImageROI. Значит, тормоза были в cvCopyImage. Ввожу тут всех в заблуждение своим невежеством.
-
Абсолютной точности добиться не получится. Хотя... Попробуй анализировать не всё изображение, а только вертикальную центральную часть. Что-то вроде: cvSetImageROI(frame, cvRect(frame->width / 4, 0, frame->width / 2, frame->height)); // Тут поиск шаблонов... cvResetImageROI(frame); Да, будет гораздо точнее.
-
Попробовал стандартный пример из OpenCV с motion templates - достаточно правильно определяется движение руки. А в чём конкретно проблема?