Для надежного и несколько ресурсоемкого подхода я бы предложил сначала преобразовать изображение с помощью cv :: transform, чтобы ненулевые значения каналов выходного изображения соответствовали объектам с цветами, которые вы хотите отслеживать.Например,
b g r bias
r' [ -1 -1 1 -15 ]
b' [ 1 -1 -1 -15 ]
- это матрица преобразования, которая назначит ненулевое значение для очень красных пикселей для первого выходного канала и для очень синих пикселей для второго выходного канала.
Затем,вы можете запустить cv :: findContours на выходных каналах, один за другим, чтобы найти благоприятно окрашенные капли.Затем, перебирая пары, 3 кортежа и т. Д. Больших двоичных объектов и выполняя некоторые геометрические проверки на них (например, если ваш маркер состоит из синего, красного и зеленого круга, вы должны убедиться, что эти три пузырька являются «круглыми»«достаточно формы и лежат близко друг к другу, чтобы считать их маркером, а не просто шумом) маркеры могут быть расположены.
Чтобы отслеживать их, вместо повторного запуска вышеуказанного алгоритма в каждом кадре, вы можете применитькакой-то CAMShift для отслеживания на основе meanShift после запуска cv :: transform.В случае CAMShifting следует проверять каждый кадр, если отслеживаемый объект по-прежнему является маркером, если требуется надежный трекер.
Необработанные значения положения (и, возможно, вращения) из отслеживания будуткак правило, быть несколько шумно.Например, если в комнате есть флуоресцентные лампы и используется красно-синий маркер, трекинг может немного «мерцать».Для компенсации полезен фильтр Калмана или расширенный фильтр Калмана, но он содержит множество параметров, которые необходимо отрегулировать / угадать.