Как обрабатывать ориентиры позы, левой руки, правой руки и лица в правильном порядке с помощью MediaPipe?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как обрабатывать ориентиры позы, левой руки, правой руки и лица в правильном порядке с помощью MediaPipe?

Сообщение Anonymous »

Я работаю над проектом, в котором мне нужно обрабатывать ориентиры позы, ориентиры левой руки, ориентиры правой руки и ориентиры лица в определенном порядке с помощью MediaPipe. Однако ориентиры не обрабатываются в правильной последовательности. Вместо того, чтобы следовать порядку «поза -> левая рука -> правая рука -> лицо», камера, похоже, захватывает и обрабатывает ориентиры в другом порядке, часто начиная с ориентиров на правой руке.
Вот краткий обзор моей установки:
Я использую MediaPipe для сбора данных об ориентирах.
Я реализовал обратные вызовы для каждого типа ориентиров (поза, левая рука, правая рука, лицо).
Мне нужны данные об ориентирах. обрабатываться в следующем порядке: поза -> левая рука -> правая рука -> лицо.
Функции обратного вызова запускаются, но порядок обработки неверен.
Буду признателен за любые рекомендации и примеры. о том, как обеспечить обработку ориентиров в правильной последовательности. В частности:
Как обеспечить правильный порядок обработки ориентиров?
Есть ли способ буферизовать или временно хранить ориентиры до тех пор, пока они не будут обработаны в желаемом порядке?
Вот для справки фрагмент моей текущей реализации:

Код: Выделить всё

 private void startLandmarkPacketCallbacks() {
// Pose landmarks callback
processor.addPacketCallback(
"pose_landmarks",
(packet) -> {
synchronized (landmarkLock) {
if (packet != null) {
try {
NormalizedLandmarkList landmarks = PacketGetter.getProto(packet, NormalizedLandmarkList.class);
if (landmarks != null) {
currentPoseLandmarks = landmarks;
checkFrameComplete();
}
} catch (InvalidProtocolBufferException e) {
Log.e(TAG, "Pose landmarks error: " + e.getMessage());
}
}
}
}
);

// Left hand landmarks callback
processor.addPacketCallback(
"left_hand_landmarks",
(packet) -> {
synchronized (landmarkLock) {
if (packet != null) {
try {
NormalizedLandmarkList landmarks = PacketGetter.getProto(packet, NormalizedLandmarkList.class);
if (landmarks != null) {
currentLeftHandLandmarks = landmarks;
checkFrameComplete();
}
} catch (InvalidProtocolBufferException e) {
Log.e(TAG, "Left hand landmarks error: " + e.getMessage());
}
}
}
}
);

// Right hand landmarks callback
processor.addPacketCallback(
"right_hand_landmarks",
(packet) -> {
synchronized (landmarkLock) {
if (packet != null) {
try {
NormalizedLandmarkList landmarks = PacketGetter.getProto(packet, NormalizedLandmarkList.class);
if (landmarks != null) {
currentRightHandLandmarks = landmarks;
checkFrameComplete();
}
} catch (InvalidProtocolBufferException e) {
Log.e(TAG, "Right hand landmarks error: " + e.getMessage());
}
}
}
}
);

// Face landmarks callback
processor.addPacketCallback(
"face_landmarks",
(packet) -> {
synchronized (landmarkLock) {
if (packet != null) {
try {
NormalizedLandmarkList landmarks = PacketGetter.getProto(packet, NormalizedLandmarkList.class);
if (landmarks != null) {
currentFaceLandmarks = landmarks;
checkFrameComplete();
}
} catch (InvalidProtocolBufferException e) {
Log.e(TAG, "Face landmarks error: " + e.getMessage());
}
}
}
}
);
}

private void checkFrameComplete() {
if (currentPoseLandmarks != null && currentLeftHandLandmarks != null &&
currentRightHandLandmarks != null && currentFaceLandmarks != null) {

// Add to queues
poseLandmarksQueue.offer(currentPoseLandmarks);
leftHandLandmarksQueue.offer(currentLeftHandLandmarks);
rightHandLandmarksQueue.offer(currentRightHandLandmarks);
faceLandmarksQueue.offer(currentFaceLandmarks);

// Limit queue sizes
while (poseLandmarksQueue.size() > LANDMARK_HISTORY_SIZE) poseLandmarksQueue.poll();
while (leftHandLandmarksQueue.size() > LANDMARK_HISTORY_SIZE) leftHandLandmarksQueue.poll();
while (rightHandLandmarksQueue.size() > LANDMARK_HISTORY_SIZE) rightHandLandmarksQueue.poll();
while (faceLandmarksQueue.size() >  LANDMARK_HISTORY_SIZE) faceLandmarksQueue.poll();

// Check if there is enough data
if (poseLandmarksQueue.size() == LANDMARK_HISTORY_SIZE &&
leftHandLandmarksQueue.size() == LANDMARK_HISTORY_SIZE &&
rightHandLandmarksQueue.size() == LANDMARK_HISTORY_SIZE &&
faceLandmarksQueue.size() == LANDMARK_HISTORY_SIZE) {

processLandmarks();
}

resetCurrentFrame();
}
}

private void resetCurrentFrame() {
currentPoseLandmarks = null;
currentLeftHandLandmarks = null;
currentRightHandLandmarks = null;
currentFaceLandmarks = null;
}
Спасибо за помощь!

Подробнее здесь: https://stackoverflow.com/questions/793 ... correct-or
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»