Действия по обнаружению и отслеживанию капель в видео с использованием OpenCV Stack Overflow

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

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

1.) Преобразовал исходное изображение в оттенки серого

2.) Применимое размытие по Гауссу, затем обнаружение края Канни (Нажмите здесь для изображения)

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

4.) Использовали findContours найти контуры. (Нажмите здесь для изображения)

Вышеупомянутые 4 шага — то, что я сделал до сих пор. Следующие шаги ниже, что я должен делать дальше?

  • Разбавьте двоичное изображение сначала после кадрирования и до нахождения контуров, чтобы убедиться, что контуры будут замкнуты и не открыты?
  • Может быть, игнорировать те, которые очень открыты? (Любые советы о том, как на самом деле это сделать?)
  • floodFill() каждые замкнутые круги
  • Найдите область каждого контура, используя contourArea() (Могу ли я оценить объем капли после этого шага с помощью нескольких предположений, таких как ее форма, соотношение пикселей к объему и т. Д.?)
  • Найдите центр каждого контура и сохраните его в массив, чтобы я мог сравнить его с центром той же капли в следующем кадре. Как только я узнаю расстояние, пройденное от центра капли, и частоту кадров видео, я смогу оценить скорость.

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

Любая помощь будет принята с благодарностью, спасибо.

2

Решение

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

Для уточнения я назову красный ROI с вашего изображения «redROI».

  1. Найти все капли в redROI. Запомните позиции и идентификаторы.
  2. Для каждой позиции капли из предыдущего шага создайте область интереса, похожую на желтый прямоугольник:
    Для каждого прямоугольника проверьте, есть ли внутри него капля.
    Если да — возможно, это капля из предыдущего кадра, так что вы ищете.
    Если нет — вы можете попытаться снова найти в немного большем прямоугольнике или предположить, что темная точка этой области интереса — это капля. Если ROI находится вблизи дна redROI, вероятно, капли нет — забудьте об этом.

Обратите внимание на несколько вещей:
-Размер прямоугольника зависит от того, насколько быстро движутся капли и могут ли они двигаться только по вертикали или по диагонали (ветер может изменить направление движения).
-перед поиском капель проверьте, не пересекаются ли все прямоугольники (у них нет общей области -> (Rect1 & Rect2) .area () == 0 для каждой пары прямоугольников).
-перед поиском капель в ROI убедитесь, что этот ROI находится внутри redROI. Так что просто используйте этот код: roi = roi & redROI;
Найдя новые позиции каждой старой капли, ищите капли в целом redROI, чтобы вы не пропустили ни одной новой капли.

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

Может быть, игнорировать те, которые очень открыты? (Любые советы о том, как на самом деле
сделай это?)

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

floodFill () каждые замкнутые круги

Вы можете просто использовать drawContours и установить thickness параметр для -1 — более простое и быстрое решение.

редактировать:
Вы также можете попробовать использовать оптический поток — он уже реализован в openCV, здесь вы можете прочитать хороший урок об этом: http://robotics.stanford.edu/~dstavens/cs223b/ (начать с файлов .pdf)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]