Более быстрые альтернативы cvFindContour()

Обнаружение контуров занимает большую часть моего компьютерного зрения, и оно должно быть быстрее. Я так оптимизировал все остальное с помощью инструкций NEON и векторизации, что действительно обнаружение контуров доминирует над профилем. К сожалению, мне не очевидно, как это оптимизировать.

Я выполняю классический процесс обнаружения прямоугольников, чтобы найти опорные маркеры, то есть cvFindContours (), с последующим аппроксимированием квадратов по контурам. В случаях, когда видно много-много маркеров (или катастрофически, когда видна плотная сетка прямоугольников, которые не являются маркерами ), один только вызов cvFindContours ()может занять > 30 мс на iPhone.

Я уже заменил невероятно дорогой C++ cv ::FindContours ()на cvFindContours (). В частности, если передается вектор >, версия C++ тратит больше времени на выделение и заполнение векторов, чем ее внутренний cvFindContours ()!

Теперь я полностью привязан к времени в cvFindContours или, точнее, в cvFindNextContour (). Код внутри cvFindNextContour является тяжелым ветвлением -, и его нелегко векторизовать. Он также реализует сложный алгоритм, в котором я не уверен, что ошибусь при любой попытке оптимизации.

Я уже посмотрел на cvBlobLib (для устранения неоднозначности, я имею в виду этот:http://code.google.com/p/cvblob/)чтобы увидеть, предоставляет ли он альтернативные алгоритмы, которые могут делать то же самое быстрее. Базовая загрузка исходного кода невероятно медленная, потому что она записывает контуры в стандартный ::список ()и тратит почти все свое время на выделение памяти.Замена этого списка на std ::vector pre -размером до 256 элементов для устранения начальных копий при отправке _назад ()по-прежнему оставляет вам функцию, которая выполняется в 3 раза дольше, чем cvFindContours (), 66% из них непосредственно в cvb ::cvLabel (). Так что идти по этому пути нецелесообразно.

Есть ли у кого-нибудь идеи о том, как я могу оптимизировать обнаружение многих прямоугольников. Мой расплывчатый жест включает:

  1. Существуют ли какие-либо быстрые реализации, эквивалентные cvFindContour (), в идеале в виде исходного кода, поскольку я многоплатформенный?

  2. Большинство контуров не требуются, полезны только «удачные» прямоугольники. В частности, их внутренние контуры тогда бесполезны. Теоретически, могу ли я вообще не вызывать cvFindContours, а вместо этого вызывать cvStartFindContours/cvFindNextContour, проверяя каждый контур как найденный и не рекурсивно, если я нахожу прямоугольник, который ищу, поскольку тогда подпрямоугольники гарантированно бесполезны?

  3. Можно ли использовать совершенно другой алгоритм обнаружения прямоугольников, отличный от классического подхода FindContours ()/ApproxPoly ()?

  4. Есть ли способ «заправить» cvFindContours полезными интересующими областями? Например. БЫСТРОЕ обнаружение углов почти всегда возвращает мои реперные маркерные углы даже при очень агрессивном пороге. Есть ли способ использовать эту точку, чтобы ограничить обнаружение? (К сожалению, я не уверен, насколько это помогает, опять же в случае большого количества маркеров или плотных линий сетки, не связанных с маркерами, что часто происходит в моем приложении.)

  5. В том же ключе, что и выше, поскольку обнаружение BLOB-объектов может (, если я правильно понимаю ), быть реализовано как рекурсивное заполнение флудом -, существуют ли какие-либо быстрые векторизованные реализации этого, которые затем можно использовать для извлечения интересных BLOB-объектов? прямоугольники и определение контура семян оттуда?

Любые идеи будут приветствоваться!

6
задан Alex Ferrier 4 July 2012 в 22:18
поделиться