Определить цель в другой цели

Я использую Vuforia для распознавания целей через камеру.

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

Я уже вижу два маркера во времени. Я могу получить матрицу целей 4x4. Одна из идей заключалась в том, чтобы сделать проекцию 4x4 на плоскость z0x для обеих целей, а затем определить, содержит ли одна матрица проекции вторую (но я не знаю, как это сделать)

Некоторый код, как я получаю матрицу

- (void) renderFrameWithState:(const Vuforia::State&)state projectMatrix:(Vuforia::Matrix44F&)projectionMatrix {
//some opengl initializations
 for (int i = 0; i < state.getNumTrackableResults(); ++i) {
        // Get the trackable
        const Vuforia::TrackableResult* result = state.getTrackableResult(i);
        const Vuforia::Trackable& trackable = result->getTrackable();

        Vuforia::Matrix44F modelViewMatrix = Vuforia::Tool::convertPose2GLMatrix(result->getPose()); //getPose() returns 3x4 matrix
}
}

person DenFav    schedule 05.04.2017    source источник


Ответы (1)


Проецировать матрицу на ту же плоскость очень просто — у вас уже есть этот код, если у вас есть работающий образец Vuforia. Это что-то вроде этого:

SampleUtils::multiplyMatrix(&projectionMatrix.data[0],
                            &modelViewMatrix.data[0] ,
                            &modelViewProjection.data[0]);

ОДНАКО, я не думаю, что вам действительно нужно их проецировать, вы можете просто сравнить две матрицы, которые вы получаете от Vuforia.

Один из способов проверить, находится ли одна матрица внутри другой (не на 100% точный, но довольно простой) — по центральной точке и размеру. Значение - возьмите центральную точку одного (значения положения x и y в матрице - это modelViewMatrix.data[12] и modelViewMatrix.data[13] соответственно) и посмотрите, находится ли эта точка после добавления ширины и высоты в пределах границы второй матрицы (опять же по центру второй матрицы, ширине и высоте).

person yakobom    schedule 06.04.2017
comment
Итак, я должен указать.getTrackableResult(i) для каждой из целей, convertPose2GLMatrix(result->getPose()) для получения матрицы 4x4 и выполнить все вычисления, которые вы описали выше, с матрицей 4x4? Насколько я понимаю, он не считает плоскость, и если меньшая цель будет выше второй на 10 см, то это может сказать мне, что меньшая находится внутри второй, это правильно? - person DenFav; 06.04.2017
comment
Я не думаю, что это правильно. Но вы можете использовать метод, который я вам предложил, и для проекционной матрицы. В любом случае, я думаю, вы должны попробовать один из методов или оба - это должно быть довольно легко. Если это поможет, см. здесь некоторое объяснение их матрицы: stackoverflow.com/questions/29061257/ - person yakobom; 06.04.2017
comment
Не могли бы вы дать ссылку на описание матрицы 4x4. Я не могу его найти, я хочу убедиться, что 12 и 13 являются центром, а также хочу знать другие значения, которые можно как-то использовать (это может быть полезно) - person DenFav; 06.04.2017
comment
Конечно, но да, 12, 13 и 14 - это x, y и z центральной точки. Это общее объяснение: opengl-tutorial.org/beginners-tutorials /tutorial-3-матрицы. Как строится сама матрица, зависит от реализации, и вы используете Vuforia. Но я настоятельно рекомендую испытать себя - если вы не уверены, добавьте какое-то число (200?) в ваш matrix.data[12] и посмотрите результат... Этот практический подход быстрее приведет вас к желаемому результату. - person yakobom; 06.04.2017
comment
Спасибо. Я проверил ссылку, но у меня остался еще один вопрос - как получить ширину и высоту в Vuforia? Должен ли я также использовать матричную математику? - person DenFav; 06.04.2017
comment
Как я уже сказал, ссылка является общей. Если вы посмотрите на раздел Матрицы перевода, вы увидите, что последний столбец (который на самом деле является ячейками 12, 13, 14, 15) содержит x, y и z в ячейках 12, 13, 14. Вы можете получить ширину и высота из API Vuforia 'getSize' на imageTarget. К настоящему времени у вас должно быть все, что вам нужно, чтобы опробовать решение, мой друг. - person yakobom; 06.04.2017
comment
Давайте продолжим обсуждение в чате. - person DenFav; 06.04.2017