Передать изображение с камеры в Google Vision API - PullRequest
0 голосов
/ 27 февраля 2019

Я абсолютно застрял в следующем действии, где я пытаюсь сделать изображение с камеры, сохранить его, а затем отправить его в API Google Vision для дальнейшей обработки.

Работа с изображением работает нормально, оно сохраняется в Галерее;Запрос API также работает нормально, так как я не получаю никаких сообщений об ошибках.Тем не менее, тост, который содержит анализ изображений, просто не появляется, и я абсолютно не знаю, почему.Я очень уверен, что запрос API не дает сбоя, поскольку я мог видеть ответы, такие как «400», ранее в Logcat;однако, теперь это не просто отвечает вообще.

Я пытаюсь сделать изображение, сохранить его на устройстве, открыть его и передать в качестве входного потока в Google Vision API.

Буду очень признателен за любые советы или помощь, спасибозаблаговременно!

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.api.client.extensions.android.json.AndroidJsonFactory;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.services.vision.v1.Vision;
import com.google.api.services.vision.v1.VisionRequestInitializer;
import com.google.api.services.vision.v1.model.AnnotateImageRequest;
import com.google.api.services.vision.v1.model.BatchAnnotateImagesRequest;
import com.google.api.services.vision.v1.model.BatchAnnotateImagesResponse;
import com.google.api.services.vision.v1.model.FaceAnnotation;
import com.google.api.services.vision.v1.model.Feature;
import com.google.api.services.vision.v1.model.Image;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;


public class VisionAPIActivity extends AppCompatActivity {

    ImageView imageView2;
    ImageView imageView1;
    static final int REQUEST_TAKE_PHOTO = 1;
    String currentPhotoPath;
    final Uri photoURI = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vision_api);
        Toolbar toolbar = findViewById(R.id.toolbar);
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        setSupportActionBar(toolbar);

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });


    }

    public void imageClick(View view) throws FileNotFoundException {
        imageView2 = findViewById(R.id.imageView2);
        open();
    }

    public void open() throws FileNotFoundException {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File
                Toast.makeText(this,
                        "Photo file can't be created, please try again",
                        Toast.LENGTH_SHORT).show();
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                 final Uri photoURI = FileProvider.getUriForFile(this,
                        "xxx.xxxx.xxxx.provider",
                        photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                Toast.makeText(this,
                        "Photo URI has been created",
                        Toast.LENGTH_SHORT).show();

               // run();
            }
            Vision.Builder visionBuilder = new Vision.Builder(
                    new NetHttpTransport(),
                    new AndroidJsonFactory(),
                    null);

            visionBuilder.setVisionRequestInitializer(
                    new VisionRequestInitializer("xxx"));
            final Vision vision = visionBuilder.build();

            Log.i("log-", "passed VisionBuilder Initialisation");

            // TODO:
            // Convert photo to byte array
            ImageView mImageView;
            mImageView = findViewById(R.id.imageView1);
            InputStream ims = getContentResolver().openInputStream(Uri.fromFile(photoFile));
            // just display image in imageview
            mImageView.setImageBitmap(BitmapFactory.decodeStream(ims));

            byte[] photoData = new byte[0];
            Log.i("log-", "Content of Photo Data" + photoData);

            Image inputImage = new Image();
            inputImage.encodeContent(photoData);
            Feature desiredFeature = new Feature();
            desiredFeature.setType("FACE_DETECTION");
            AnnotateImageRequest request = new AnnotateImageRequest();
            request.setImage(inputImage);
            Log.i("log-", "Content of inputImage" + inputImage);
            request.setFeatures(Arrays.asList(desiredFeature));
            BatchAnnotateImagesRequest batchRequest =
                    new BatchAnnotateImagesRequest();

            batchRequest.setRequests(Arrays.asList(request));
            BatchAnnotateImagesResponse batchResponse =
                    null;
            try {
                batchResponse = vision.images().annotate(batchRequest).execute();
                List<FaceAnnotation> faces = batchResponse.getResponses()
                        .get(0).getFaceAnnotations();

                // Count faces
                int numberOfFaces = faces.size();
                Log.i("log-", "number Of Faces" + numberOfFaces);

                // Get joy likelihood for each face
                String likelihoods = "";
                for (int i = 0; i < numberOfFaces; i++) {
                    likelihoods += "\n It is " +
                            faces.get(i).getJoyLikelihood() +
                            " that face " + i + " is happy";
                }

                // Concatenate everything
                final String message =
                        "This photo has " + numberOfFaces + " faces" + likelihoods;

                // Display toast on UI thread
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                message, Toast.LENGTH_LONG).show();
                    }
                });
            }
            catch (IOException e) {
                e.printStackTrace();
            }


        }
        return;
    }

    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = image.getAbsolutePath();
        return image;
    }
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
        super.onActivityResult(requestCode,resultCode,data);
        Bitmap bitmap=(Bitmap)data.getExtras().get("data");
        // imageView2.setImageBitmap(bitmap);
    }
}
...