我有一个模块可以将卡通脸放在眼睛上或现场相机预览中的任何其他位置。我正在使用Moodme Sdk。我已经实现了相机预览。我获得了具有里程碑意义的x和y轴值。但我不知道我在哪里添加这些地标以及如何使用地标将图像放在眼睛上。这是让人们面对现场相机的代码。
@Override
public void onImageAvailable(ImageReader reader) {
Image image = imageReader.acquireLatestImage();
if (image == null) {
return;
}
ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
byte[] yBytes = new byte[yBuffer.remaining()];
yBuffer.get(yBytes);
ByteBuffer uBuffer = image.getPlanes()[1].getBuffer();
byte[] uBytes = new byte[uBuffer.remaining()];
uBuffer.get(uBytes);
ByteBuffer vBuffer = image.getPlanes()[2].getBuffer();
byte[] vBytes = new byte[vBuffer.remaining()];
vBuffer.get(vBytes);
tracker.processImageBuffer(yBytes, WIDTH, HEIGHT, WIDTH, MDMTrackerManager.FrameFormat.GRAY);
//renderer.updateTextureImage(yBytes, uBytes, vBytes, image.getPlanes()[1].getPixelStride());
image.close();
if (tracker.isFaceTracked()) {
// renderer.updateVertices();
}
if (tracker.isFaceTracked()) {
// translate to opengl coordinates
float[] landmarks = new float[66*2];
for (int i = 0; i < 66; ++i) {
if(i >=17 && i <27 || i >=36 && i <48 ) {
landmarks[2 * i] = 1.0f - tracker.getLandmarks()[2 * i] / (HEIGHT / 2);
landmarks[2 * i + 1] = 1.0f - tracker.getLandmarks()[2 * i + 1] / (WIDTH / 2);
}
}
// renderer.updateLandmarks(landmarks);
} else {
// renderer.updateLandmarks(null);
}
long currentTime = System.currentTimeMillis();
double fps = 1000.0 / (currentTime - lastFrameTime);
updater.update(fps);
lastFrameTime = currentTime;
}
我还使用了人脸检测库但是这并没有给我准确的结果。是否有任何良好的人脸检测库并将图像或蒙版放在相机预览上。任何帮助将不胜感激。
答案 0 :(得分:2)
有许多库可用于在相机预览上添加面罩。几乎所有人都使用OpenCV。查看这些库。
Android GPUimage似乎在相机预览中添加了图像。类似的question使用此库在相机预览上添加面罩。您可以查看问题上发布的答案。
FaceFilter库执行相同的工作,但是在捕获的图像上。但是,您可以看到作者发布的库的tutorial,并将其与面部检测集成。有几个面部检测教程。这个tutorial解释了如何实现面部检测,同时还在其上覆盖图形。虽然教程中的重叠图形不多,但它可能会解决您的问题。