Обнаружение объекта в изображении камеры в C# [закрыто]

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

в частности, изображение будет игровой доской, скажем, для целей этого вопроса, Что это игровая доска судоку.

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

есть ли какие-либо алгоритмы, библиотеки, образцы кода или даже просто яркие идеи о том, как я буду искать и извлекать соответствующую часть изображения?

10 ответов


используйте бесплатный AForge.Net библиотека обработки изображений для этого. есть куча классных вещей, с которыми можно поиграть.


вам нужно выполнить работу фильтров и маски на изображении.

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

вы также можете использовать порог изображения для обнаружения объекта. Вы можете посмотреть на библиотеку обработки изображений ниже.

  1. фильтры API для C, C++, C#, Visual Basic .NET, Delphi, Питон
  2. http://www.catenary.com/
  3. CImg по богаче, чем выше библиотека, однако она написана на C++

один из (Я думаю, много возможных) подходов:

  1. найдите фильтр, который "получает / вычисляет" прямые линии (ребра и т. д.) из данного образа.

  2. теперь у вас есть коллекция (массив) всех строк (xStart,yStart & xEnd,yEnd). Вы можете легко вычислить все длины линий по координатам.

  3. , учитывая, что вы всегда можете (!) ожидайте" one-biggest-square / rectangle " внутри изображения, это будет довольно легко найти и вычислить область wanted-sudoku-rectangle и обрезать ее с изображения, чтобы сделать некоторую дальнейшую обработку.

EDIT: решение / Программирование такого рода проблем всегда сложно, но очень интересно в то же время :).


вы можете попробовать использовать Преобразование Хафа.


Я бы начал с использования углового детектора (детектор Харриса работает хорошо), чтобы найти пересечения и углы сетки судоку.

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

исправление изображений не является простым и влечет за собой довольно много математики.

будьте готовы сделать некоторые чтении :)

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

многие люди предлагают использовать нейронные сети. Я совершенно уверен, что бросать нейронную сеть на эту проблему совершенно излишне. NNs (иногда) хороши, если вам нужно классифицировать объекты, где определение объекта расплывчато. "Найти автомобили в изображении" - это проблема, которая могла бы использовать для нейронной сети, так как автомобили могут выглядеть очень по-разному, но имеют некоторые функции. Таким образом, учитывая достаточное количество данных, вы можете обучить NN обнаруживать автомобили. В этой задаче у вас есть что-то очень регулярное и всегда выглядит почти одинаково, поэтому NN не сделает ничего проще или лучше.


использовать aforge colorfiltering

существует много методов фильтрации для c#, в основном я предпочитаю фильтры aforge, для этой цели у них мало фильтров, они

* ColorFiltering
* ChannelFiltering
* HSLFiltering
* YCbCrFiltering
* EuclideanColorFiltering

посмотреть здесь


взгляните на: https://github.com/dajuric/accord-net-extensions

библиотека "присоединяется" к бесплатной AForge.NET и Accord.NET библиотека и добавляет обработки изображений и отслеживания объектов-алгоритмы. Образцы включены:)


вы можете попробовать сначала найти пересечения жирным шрифтом и использовать их в качестве регистрационных знаков.

Это было бы хорошим началом, потому что:

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

Так:

  1. применить пограничный фильтр
  2. Поиск маске* о какой идеал!--20-->+ должно выглядеть по всему изображению, записывая все, что хорошо соответствует
  3. выберите набор, который соответствует вашим ожиданиям лучше всего, в зависимости от местоположения относительно друг друга
  4. теперь вы также знаете, где должны быть числа, поэтому вы можете легко извлечь их.

* более сложным решением было бы использовать нейронную сеть вместо маски для распознавания пересечений. Это может стоить того, так как вы, вероятно, собираюсь использовать один для OCR чисел.


не отвергая никаких других идей, Шаг 1 действительно должен быть обнаружением вращения изображения. Вы можете сделать это, определив локальный градиент в каждой точке и создав его гистограмму. Это будет иметь 4 основных компонента при смещениях на 90 градусов. В идеале это будет 0, 90, 180 и 270, но если это не так, вы должны повернуть свое изображение. Е. Г. в качестве примера на рисунке вы должны начать с вращением в течение примерно 8 градусов по часовой стрелке.


вы должны google для CamShift или отслеживание Blob или фильтр частиц. Они все полезны для вашей проблемы. И большинство из них поставляются с OpenCV, и это обертка C# AForge.NET - ... Вы найдете несколько хороших демонстраций на Youtube, показывающих, как они работают.

удачи