2016-09-17 2 views
1

Ich versuche, mit Face API von Microsoft Cognitive Services zu spielen. Ich frage mich, wie man ein lokales Bild durch Rest-API-Aufrufe an Face API sendet und die Ergebnisse unter Verwendung von JAVA anfordert. Kann mir bitte jemand helfen?So senden Sie ein lokales Bild anstelle von URL an Microsoft Cognitive Face-API mithilfe von JAVA

Die Testing opting von Microsoft auf ihrer Website verwendet nur URL, versuchte ich, meinen lokalen Pfad zu URL konvertieren und geben Sie es als Eingabe, aber das funktioniert nicht.

+0

Nicht sicher, welchen Teil von "ihrer Website" Sie betrachten. Von "Microsoft Cognitive Services - Dokumentation", https://www.microsoft.com/cognitive-services/en-us/face-api/documentation/get-started-with-face-api/gettingstartedwithfaceapiinjavaforandroid, sieht es aus wie te ' detect'-Methode verwendet ein 'InputSteam', das ein Bild im JPEG-Format enthält. – david

Antwort

1

Eine Option ist die Verwendung der Klasse FileEntity.

// This sample uses the Apache HTTP client from HTTP Components (http://hc.apache.org/httpcomponents-client-ga/) 
import java.io.File; 
import java.net.URI; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.client.utils.URIBuilder; 
import org.apache.http.entity.FileEntity; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.util.EntityUtils; 

public class Face 
{ 
    public static void main(String[] args) 
    { 
     HttpClient httpclient = HttpClients.createDefault(); 

     try 
     { 
      URIBuilder builder = new URIBuilder("https://api.projectoxford.ai/face/v1.0/detect"); 

      builder.setParameter("returnFaceId", "true"); 

      URI uri = builder.build(); 
      HttpPost request = new HttpPost(uri); 
      request.setHeader("Ocp-Apim-Subscription-Key", "YOUR_KEY"); 


      // Request body 
      File file = new File("YOUR_FILE"); 
      FileEntity reqEntity = new FileEntity(file, "application/octet-stream"); 
      request.setEntity(reqEntity); 

      HttpResponse response = httpclient.execute(request); 
      HttpEntity entity = response.getEntity(); 

      if (entity != null) 
      { 
       System.out.println(EntityUtils.toString(entity)); 
      } 
     } 
     catch (Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 
0

Die Arbeit mit FileEntity scheint der eleganteste Weg zur Lösung des Problems zu sein. Es gab eine kleine Änderung an ctrashs Code: Da der Konstruktor FileEntity(File, String) veraltet ist, muss der Konstruktor FileEntity(File, ContentType) verwendet werden. In diesem Fall muss der Inhaltstyp des Headers und der Image-Datei "application/octet-stream" sein. Ich habe es mit diesem Code zu arbeiten:

// This sample uses the Apache HTTP client from HTTP Components (http://hc.apache.org/httpcomponents-client-ga/) 
import java.io.File; 
import java.net.URI; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.client.utils.URIBuilder; 
import org.apache.http.entity.ContentType; 
import org.apache.http.entity.FileEntity; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.util.EntityUtils; 

public class PostTest 
{ 
    public static void main(String[] args) 
    { 
     CloseableHttpClient httpclient = HttpClients.createDefault(); 

     try 
     { 
      URIBuilder uriBuilder = new URIBuilder("https://westus.api.cognitive.microsoft.com/face/v1.0/detect"); 

      uriBuilder.setParameter("returnFaceId", "true"); 
      uriBuilder.setParameter("returnFaceLandmarks", "false"); 
      uriBuilder.setParameter("returnFaceAttributes", "age"); 

      URI uri = uriBuilder.build(); 
      HttpPost request = new HttpPost(uri); 

      // Request headers. Replace the example key below with your valid subscription key. 
      request.setHeader("Content-Type", "application/octet-stream"); 
      request.setHeader("Ocp-Apim-Subscription-Key", "YOUR_SUBSCRIPTION_KEY"); 



      // Request body 


      File file = new File("YOUR_IMAGE_FILE"); 

      FileEntity reqEntity = new FileEntity(file, ContentType.APPLICATION_OCTET_STREAM); 
      request.setEntity(reqEntity); 

      HttpResponse response = httpclient.execute(request); 
      HttpEntity entity = response.getEntity(); 
      System.out.println(response.getStatusLine()); 

      if (entity != null) 
      { 
       System.out.println(EntityUtils.toString(entity)); 

      } 
     } 
     catch (Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

Nach der korrekten Ausführung zeigt das Terminal das JSON-Objekt die Face API zurückgibt.

Danke, cthrash, denn dies ist der einzige Ort im Internet, wo ich gelernt habe, wie man das macht!

Verwandte Themen