Вот краткий обзор моей установки:
Я использую 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