Как определить полное тело на изображении - PullRequest
0 голосов
/ 02 сентября 2018

Как я могу использовать обнаружение каскада по всему телу на изображении в режиме просмотра изображений?

По сути, я хочу объединить следующие коды и создать приложение, которое позволит пользователю захватывать изображение с помощью приложения камеры и отображать изображение в упражнении. Затем приложение обнаруживает все тело человека на изображении, выделяя его прямоугольником.

Это мой код для захвата изображения с последующим показом в действии:

package com.hehe.trumpcard;

import android.content.Intent;
import android.graphics.Bitmap;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

private ImageView im;
private Button b;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    im = (ImageView) findViewById(R.id.imageid); //Your image View
    b = (Button) findViewById(R.id.buttonid); // your Button

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent img = new Intent(); //Your Intent
            img.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //the intents action to capture the image
            startActivityForResult(img, 1);//start the activity adding any code .1 in this example
        }

    });
}

protected void onActivityResult(int requestCode,int resultCode,Intent data){
    super.onActivityResult(requestCode,resultCode,data);//method retrieves the requestCode , its result and the data containing the pic from system
    if(requestCode==1&&resultCode==RESULT_OK){
        Bitmap photo = (Bitmap)data.getExtras().get("data"); //get data and casts it into Bitmap photo
        im.setImageBitmap(photo);// set photo to imageView
    }

}
}

И код для полного обнаружения тела (в режиме реального времени):

package com.hehe.trumpcard;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.util.Log;
import android.view.WindowManager;

import org.opencv.android.*;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;
import org.opencv.core.*;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

public class Main3Activity extends AppCompatActivity implements CvCameraViewListener {

private CameraBridgeViewBase openCvCameraView;
private CascadeClassifier cascadeClassifier;
private Mat grayscaleImage;
private int absoluteFaceSize;

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status){
            case LoaderCallbackInterface.SUCCESS:
                initializeOpenCVDependencies();
                break;
            default:
                super.onManagerConnected(status);
                break;
        }
    }
};

private void initializeOpenCVDependencies(){
    try{
        // Copy the resource into a temp file so OpenCV can load it
        InputStream is = getResources().openRawResource(R.raw.haarcascade_fullbody);
        File cascadeDir = getDir("cascade", Context.MODE_APPEND);
        File mCascadeFile = new File(cascadeDir, "haarcascade_fullbody.xml");
        FileOutputStream os = new FileOutputStream(mCascadeFile);

        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = is.read(buffer)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        is.close();
        os.close();

        // Load the cascade classifier
        cascadeClassifier = new CascadeClassifier(mCascadeFile.getAbsolutePath());
    } catch (Exception e) {
        Log.e("OpenCVActivity", "Error loading cascade", e);
    }

    // And we are ready to go
    openCvCameraView.enableView();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    openCvCameraView = new JavaCameraView(this, -1);
    setContentView(openCvCameraView);
    openCvCameraView.setCvCameraViewListener(this);
    //setContentView(R.layout.activity_main);
}

@Override
public void onCameraViewStarted(int width, int height) {
    grayscaleImage = new Mat(height, width, CvType.CV_8UC4);
    // The faces will be a 20% of the height of the screen
    absoluteFaceSize = (int) (height * 0.2);
}

@Override
public void onCameraViewStopped() {

}

@Override
public Mat onCameraFrame(Mat aInputFrame) {
    // Create a grayscale image
    Imgproc.cvtColor(aInputFrame, grayscaleImage, Imgproc.COLOR_RGBA2RGB);

    MatOfRect faces = new MatOfRect();

    // Use the classifier to detect faces
    if (cascadeClassifier != null) {
        cascadeClassifier.detectMultiScale(grayscaleImage, faces, 1.1, 2, 2,
                new Size(absoluteFaceSize, absoluteFaceSize), new Size());
    }

    // If there are any faces found, draw a rectangle around it
    Rect[] facesArray = faces.toArray();
    for (int i = 0; i <facesArray.length; i++)
        Imgproc.rectangle(aInputFrame, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0, 255), 3);

    return aInputFrame;
}
@Override
public void onResume() {
    super.onResume();
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
}
}

Как мне объединить эти 2 кода? Заранее спасибо!

...