Ich versuche eine Android-Anwendung zu erstellen, wo ich google cloud vision API
zum Erkennen von Gesichtern verwende. Ich folge this Tutorial. Das Problem ist, dass, ich bin nicht in der Lage, die toast message
zu produzieren, die angeblich auf dem Bildschirm angezeigt werden, nachdem ich auf die Schaltfläche klicken, aber die logcat
zeigt:Google Cloud Vision-API zeigt null Objektreferenz
Versuch virtuelle Methode ‚com.google.api.services aufzurufen .vision.v1.Vision $ Bilder com.google.api.services.vision.v1.Vision.images()‘auf ein null-Objekt Referenz
Hier ist der Code:
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Button upload_button;
private ImageView image_capture;
final int CAMERA_PIC_REQUEST = 100;
private Vision vision;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
upload_button = (Button) findViewById(R.id.uploadb);
image_capture=(ImageView)findViewById(R.id.capturedImage);
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{android.Manifest.permission.CAMERA},
5);
}
}
Vision.Builder visionBuilder = new Vision.Builder(
new NetHttpTransport(),
new AndroidJsonFactory(),
null);
visionBuilder.setVisionRequestInitializer(
new VisionRequestInitializer("AIzaSyAueQjrrY_GiXh7kNGlbDLKWhYP-4q77vI"));
Vision vision = visionBuilder.build();
upload_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);*/
imageDectection();
}
});
}
private void imageDectection() {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
try {
InputStream inputStream = getResources().openRawResource(R.raw.crewf);
byte[] photoData = IOUtils.toByteArray(inputStream);
Image inputImage = new Image();
inputImage.encodeContent(photoData);
Feature desiredFeature = new Feature();
desiredFeature.setType("FACE_DETECTION");
AnnotateImageRequest request = new AnnotateImageRequest();
request.setImage(inputImage);
request.setFeatures(Arrays.asList(desiredFeature));
BatchAnnotateImagesRequest batchRequest = new BatchAnnotateImagesRequest();
batchRequest.setRequests(Arrays.asList(request));
BatchAnnotateImagesResponse batchResponse =
vision.images().annotate(batchRequest).execute();
List<FaceAnnotation> faces = batchResponse.getResponses()
.get(0).getFaceAnnotations();
int numberOfFaces = faces.size();
String likelihoods = "";
for(int i=0; i<numberOfFaces; i++) {
likelihoods += "\n It is " +
faces.get(i).getJoyLikelihood() +
" that face " + i + " is happy";
}
final String message =
"This photo has " + numberOfFaces + " faces" + likelihoods;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
message, Toast.LENGTH_LONG).show();
}
});
} catch(Exception e) {
Log.d("ERROR", e.getMessage());
}
}
});
}
}
Das Bild wird in /res/raw
Position als crewf.jpg
gespeichert. Ich habe versucht, die Typen als LABEL_DETECTION
, TEXT_DETECTION
, LANDMARK_DETECTION
einzustellen, aber nichts davon funktioniert.
Kann mir jemand dabei helfen?