В настоящее время я делаю проект, в котором мне нужно найти капли чернил в видео, выполнить измерения, такие как оценка объема, скорости и пройденного расстояния, прежде чем оно станет сферическим.
Во-первых, я хотел бы знать, нахожусь ли я на правильном пути в решении этого проекта. На данный момент у меня есть:
1.) Преобразовал исходное изображение в оттенки серого
2.) Применимое размытие по Гауссу, затем обнаружение края Канни (Нажмите здесь для изображения)
3.) Расположены белые пиксели, используя findNonZero()
затем вычисляется сумма блоков строк и блока с наибольшей концентрацией белых пикселей и все строки над ним обрезаются). Это удаляет печатающие головки на изображении, поэтому область интереса — это только капли под ним.
4.) Использовали findContours
найти контуры. (Нажмите здесь для изображения)
Вышеупомянутые 4 шага — то, что я сделал до сих пор. Следующие шаги ниже, что я должен делать дальше?
floodFill()
каждые замкнутые кругиcontourArea()
(Могу ли я оценить объем капли после этого шага с помощью нескольких предположений, таких как ее форма, соотношение пикселей к объему и т. Д.?)Я также не уверен в том, как можно назначить капле идентификатор, чтобы быть уверенным, что отслеживаю его правильно и знаю, когда новая капля вошла в рентабельность инвестиций.
Любая помощь будет принята с благодарностью, спасибо.
Я думаю, что ваша идея хороша и может быть легко распространена на то, что вас удовлетворит.
Для уточнения я назову красный 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)
Других решений пока нет …