2016-07-13 13 views
1

アンドロイドデバイスからnodeJSサーバーに画像(電話カメラでキャプチャ)を送信し、そこからMicrosoft OCRを呼び出そうとしています。 私は次のようなテクニックをしています。イメージが圧縮されています。バイト配列を取得し、ノード・サーバーからHTTP POSTメソッドを使用してノード・サーバーに送信します。リクエストからバイト配列を取得してAPIを呼び出します。ノードサーバーへの画像の送信とOCR microsoft vision APIの呼び出し

ここに使用されているプロセスがあります。 1)。ビットマップイメージを取得する

2)。ここではノード側から

HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection(); 
conn.setDoInput(true); 
conn.setDoOutput(true); 
conn.setUseCaches(false); 
conn.setRequestMethod("POST"); 
conn.setRequestProperty("Connection", "Keep-Alive"); 
conn.setRequestProperty("Cache-Control", "no-cache"); 
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 

DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 
dos.writeBytes(twoHyphens + boundary + lineEnd); 
dos.writeBytes("Content-Disposition: form-data; name=\"title\""+ lineEnd); 
dos.writeBytes(lineEnd); 

ByteArrayOutputStream output = new ByteArrayOutputStream(); 
image.compress(Bitmap.CompressFormat.JPEG, 50, output); 
byte[] bufAry = output.toByteArray(); 

dos.write(bufAry, 0, bufAry.length); 

dos.writeBytes(lineEnd); 
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

dos.flush(); 

コードです::次のようにHTTPリクエストを作成

router.post('/', rawBody, function(req, res, next) 
{ 
    console.log("post request"); 
    if (req.rawBody && req.bodyLength > 0) { 
     sendRequestForOCR(req.rawBody, res); 

    } else { 
     res.send(500); 
    } 

}); 

function rawBody(req, res, next) { 
    var chunks = []; 

    req.on('data', function(chunk) { 
     chunks.push(chunk); 
    }); 

    req.on('end', function() { 
     var buffer = Buffer.concat(chunks); 

     req.bodyLength = buffer.length; 
     req.rawBody = buffer; 
     next(); 
    }); 

    req.on('error', function(err) { 
     console.log(err); 
     res.status(500); 
    }); 
} 

function sendRequestForOCR(image, res) { 

    var encodedImg = querystring.stringify({ 
     data: image 
    }); 

    var options = { 
     host: 'api.projectoxford.ai', 
     path: '/vision/v1.0/ocr', 
     port: '80', 
     method: 'POST', 
     headers: { 
      'Content-Type' : 'application/octet-stream', 
      'Ocp-Apim-Subscription-Key': 'my_key' 
     } 
    }; 

    var httpreq = http.request(options, function (response) { 
     response.setEncoding('utf8'); 
     response.on('data', function (chunk) { 
      console.log("body: " + chunk); 
     }); 
     response.on('end', function() { 
      res.send('ok'); 
     }) 
    }); 
    httpreq.write(encodedImg); 
    httpreq.end(); 
} 

しかし、私は取得していたメッセージを実行したときです:

"code":"InvalidImageFormat", "message":"Input data is not a valid image." 

することができます誰でもしてくださいコードの問題点を教えてください。 ストリーミングで画像や問題を圧縮していますか?

ありがとうございました。

答えて

2

本当に一度に1つのイメージしか処理できないので、Javaコードを変更して、マルチパートMIMEなしでJPGバイトをそのままrawに送信する必要があります。コードが書かれると、nodejsサーバーが受け取るペイロードには、multipart MIMEが必要とする追加の装飾(境界、名前など)が含まれています。したがって:

HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection(); 
conn.setDoInput(true); 
conn.setDoOutput(true); 
conn.setUseCaches(false); 
conn.setRequestMethod("POST"); 
conn.setRequestProperty("Connection", "Keep-Alive"); 
conn.setRequestProperty("Cache-Control", "no-cache"); 
conn.setRequestProperty("Content-Type", "application/octet-stream"); 

DataOutputStream dos = new DataOutputStream(conn.getOutputStream());  
ByteArrayOutputStream output = new ByteArrayOutputStream(); 
image.compress(Bitmap.CompressFormat.JPEG, 50, output); 
byte[] bufAry = output.toByteArray(); 

dos.write(bufAry, 0, bufAry.length);  
dos.flush(); 

このJavaコードでは、Microsoft認知サービスURLを直接呼び出すことができます。しかし、他の処理のために中間のnodejsサーバーが必要な場合は、バイナリ・ペイロードを変更せずに渡すことをお勧めします。あなたが指摘したように言い換えれば、答えを

function sendRequestForOCR(image, res) { 

    var options = { 
     host: 'api.projectoxford.ai', 
     path: '/vision/v1.0/ocr' 
     method: 'POST', 
     headers: { 
      'Content-Type' : 'application/octet-stream', 
      'Ocp-Apim-Subscription-Key': 'my_key' 
     } 
    }; 

    var httpreq = https.request(options, function (response) { 
     response.on('data', function (chunk) { 
      console.log("body: " + chunk); 
     }); 
     response.on('end', function() { 
      res.send('ok'); 
     }) 
    }); 
    httpreq.write(image); 
    httpreq.end(); 
+0

おかげで、エラーは私がノードサーバにアンドロイドからバイト配列を送信し、ノードからMicrosoft-認知サービスに送信する前にバイト配列を変更したかしていました。 提案された変更の後、正常に動作します。 – KTB

関連する問題