В настоящее время я делаю программу для отслеживания 4-х лопастей трех разных цветов. У меня возникают проблемы с пониманием того, как лучше поступить, со знаниями, которые у меня есть сейчас, и как уменьшить вычислительные затраты на запуск проекта. В конце этого поста приведены примеры кода шагов.
Программа содержит файл класса с именем Controllers, который имеет простые функции get и set для таких вещей, как положение X и Y, а также значения HSV, которые используются для определения порога.
Программа в неоптимизированном состоянии теперь делает следующее:
На данном этапе все работает технически, но ресурсы, необходимые для выполнения морфологических операций три раза каждый цикл в цикле 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 как точки треугольника, а также использовать эту информацию для вычисления угла и мощности выстрела стрелы. Поэтому я хочу знать, есть ли лучший способ изолировать цветные лопасти и удалить шум, который не требует от меня выполнения этих морфологических операций для каждого цвета.
Задача ещё не решена.