Изоляция и отслеживание нескольких объектов в режиме реального времени с использованием OpenCV?

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

Программа содержит файл класса с именем Controllers, который имеет простые функции get и set для таких вещей, как положение X и Y, а также значения HSV, которые используются для определения порога.

Программа в неоптимизированном состоянии теперь делает следующее:

  1. Читает изображение с веб-камеры
  2. Преобразует изображение в цветовое пространство HSV
  3. Использует функцию inRange OpenCV вместе с некоторыми ранее определенными максимальными / минимальными значениями для HSV, чтобы портировать изображение HSV 3 раза, по одному для каждого цветного весла. Это сохраняет отдельные массивы матов.
  4. (Этот шаг для меня проблематичен) — Выполняет размывание и расширение КАЖДОГО из трех пороговых изображений.
  5. Передает изображение в функцию, которая использует Моменты для создания вектора точки, описывающего контуры, а затем использует моменты для вычисления местоположения X и Y, которое сохраняется как объект и передается обратно в вектор этих лопастных объектов.

На данном этапе все работает технически, но ресурсы, необходимые для выполнения морфологических операций три раза каждый цикл в цикле while, который читает изображения с веб-камеры, сильно замедляют работу программы. (Применение 2 итераций эрозии и 3 расширений на 3 640 * 480 изображениях с приемлемой частотой кадров.)

Пороговые изображения для разных лопаток

inRange(HSV, playerOne.getHSVmin(), playerOne.getHSVmax(), threshold1);
inRange(HSV, playerTwo.getHSVmin(), playerTwo.getHSVmax(), threshold2);
inRange(HSV, powerController.getHSVmin(), powerController.getHSVmax(), threshold3);

Выполнять морфологические операции

morphOps(threshold1);

void morphOps(Mat &thresh)
{
//Create a structuring element to be used for morph operations.
Mat structuringElement = getStructuringElement(MORPH_RECT, Size(3,3));
Mat dilateElement = getStructuringElement(MORPH_RECT, Size(6, 6));
//Perform the morphological operations, using two/three iterations because the noise is horrible.
erode(thresh, thresh, structuringElement, Point(-1, -1), 3);
dilate(thresh, thresh, dilateElement, Point(-1, -1), 2);
}

Отслеживать изображение

trackFilteredObject(playerOne, threshold1, cameraFeed);
trackFilteredObject(playerTwo, threshold2, cameraFeed);
trackFilteredObject(powerController, threshold3, cameraFeed);

void trackFilteredObject(Controllers theControllers, Mat threshold, Mat HSV, Mat &cameraFeed)
{
vector <Controllers> players;

Mat temp;
threshold.copyTo(temp);
//these vectors are needed to save the output of findCountours
vector< vector<Point> > contours;
vector<Vec4i> hierarchy;
//Find the contours of the image
findContours(temp, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
//Moments are used to find the filtered objects.
double refArea = 0;
bool objectFound = false;
if (hierarchy.size() > 0)
{
int numObjects = hierarchy.size();
//If there are more objects than the maximum number of objects we want to track, the filter may be noisy.
if (numObjects < MAX_NUM_OBJECTS)
{
for (int i = 0; i >= 0; i = hierarchy[i][0])
{
Moments moment = moments((Mat)contours[i]);
double area = moment.m00;
//If the area is less than min area, then it is probably noise
if (area > MIN_AREA)
{
Controllers player;

player.setXPos(moment.m10 / area);
player.setYPos(moment.m01 / area);
player.setType(theControllers.getType());
player.setColor(theControllers.getColor());

players.push_back(player);

objectFound = true;
}
else objectFound = false;
}

//Draw the object location on screen if an object is found
if (objectFound)
{
drawObject(players, cameraFeed);
}
}
}
}

Идея состоит в том, что я хочу иметь возможность изолировать каждый объект и использовать позиции X и Y как точки треугольника, а также использовать эту информацию для вычисления угла и мощности выстрела стрелы. Поэтому я хочу знать, есть ли лучший способ изолировать цветные лопасти и удалить шум, который не требует от меня выполнения этих морфологических операций для каждого цвета.

2

Решение

Задача ещё не решена.

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


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