Я внедряю google-vision tracker .
Я видел некоторую реализацию stackoverflow ( здесь ) для создания грани лица, и это мой результат:
Обнаружение лица и растровое изображение
class MyFaceDetector extends Detector<Face> {
private Detector<Face> mDelegate;
MyFaceDetector(Detector<Face> delegate) {
mDelegate = delegate;
}
public SparseArray<Face> detect(Frame frame) {
YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, frame.getMetadata().getWidth(), frame.getMetadata().getHeight(), null); // Create YUV image from byte[]
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, frame.getMetadata().getWidth(), frame.getMetadata().getHeight()), 100, byteArrayOutputStream);// Convert YUV image to Jpeg
byte[] jpegArray = byteArrayOutputStream.toByteArray();
Bitmap bmp = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length); // Convert Jpeg to Bitmap
Frame outputbmp =new Frame.Builder().setBitmap(bmp).setRotation(Frame.ROTATION_270).build();
//part of image processing
//...
//part of image processing
double heartRateFrequency = Fft.FFT(arrayGreen, heartRateFrameLength, finalSamplingFrequency);
double battitialminuto=(int)ceil(heartRateFrequency*60);
double heartRate1Frequency = Fft.FFT(arrayRed, heartRateFrameLength, finalSamplingFrequency);
double breath1=(int)ceil(heartRate1Frequency*60);
if((battitialminuto > 10 || battitialminuto < 24) )
{
if((breath1 > 10 || breath1 < 24)) {
bufferAvgBr = (battitialminuto+breath1)/2;
}
else{
bufferAvgBr = battitialminuto;
}
}
else if((breath1 > 10 || breath1 < 24)){
bufferAvgBr = breath1;
}
Breath=(int)bufferAvgBr;
}
else {
// do nothing
}
return mDelegate.detect(outputbmp);
}
public boolean isOperational() {
return mDelegate.isOperational();
}
public boolean setFocus(int id) {
return mDelegate.setFocus(id);
}
}
Здесь есть класс FaceTrackerActivity:
private void createCameraSource() {
Context context = getApplicationContext();
detector = new FaceDetector.Builder(context)
.setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
.setMode(FaceDetector.ACCURATE_MODE)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.build();
MyFaceDetector myFaceDetector = new MyFaceDetector(detector);
detector.setProcessor(
new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory())
.build());
if (!detector.isOperational()) {
Log.w(TAG, "Face detector dependencies are not yet available.");
}
mCameraSource = new CameraSource.Builder(context, detector)
.setRequestedPreviewSize(640, 480)
.setFacing(CameraSource.CAMERA_FACING_FRONT)
.setRequestedFps(30.0f)
.build();
И здесь есть часть, в которую я бы поместил Breath, полученный из класса MyFaceDetection:
@SuppressLint("ClickableViewAccessibility")
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mPreview = (CameraSourcePreview) findViewById(R.id.preview);
mGraphicOverlay = (GraphicOverlay) findViewById(R.id.faceOverlay);
info3 = (TextView) findViewById(R.id.info3);
displayInfo = (Button) findViewById(R.id.display);
displayInfo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
info3.setText("result"+ Breath);
});
Я новичок, и я не понимаю, почему нет результата. Я не уверен, что делаю ошибку при вычислении растрового изображения или при вызове результата Breath, но при компиляции у меня нет ошибок, поэтому я не могу найти проблему. Может ли кто-нибудь направить меня на правильный путь?