我正在按照教程从以下位置提取图像中的文本:
https://cloud.google.com/functions/docs/tutorials/ocr?authuser=1
但是我不想翻译文本,我想检测并保存文本。
本教程实现了3个功能:
gcloud beta functions deploy ocr-extract --trigger-bucket [YOUR_IMAGE_BUCKET_NAME] --entry-point processImage
gcloud beta functions deploy ocr-translate --trigger-topic [YOUR_TRANSLATE_TOPIC_NAME] --entry-point translateText
gcloud beta functions deploy ocr-save --trigger-topic [YOUR_RESULT_TOPIC_NAME] --entry-point saveResult
我只希望检测文本并保存文本,但是无法删除以下代码的翻译部分:
/**
* Detects the text in an image using the Google Vision API.
*
* @param {string} bucketName Cloud Storage bucket name.
* @param {string} filename Cloud Storage file name.
* @returns {Promise}
*/
function detectText (bucketName, filename) {
let text;
console.log(`Looking for text in image ${filename}`);
return vision.textDetection({ source: { imageUri: `gs://${bucketName}/${filename}` } })
.then(([detections]) => {
const annotation = detections.textAnnotations[0];
text = annotation ? annotation.description : '';
console.log(`Extracted text from image (${text.length} chars)`);
return translate.detect(text);
})
.then(([detection]) => {
if (Array.isArray(detection)) {
detection = detection[0];
}
console.log(`Detected language "${detection.language}" for ${filename}`);
// Submit a message to the bus for each language we're going to translate to
const tasks = config.TO_LANG.map((lang) => {
let topicName = config.TRANSLATE_TOPIC;
if (detection.language === lang) {
topicName = config.RESULT_TOPIC;
}
const messageData = {
text: text,
filename: filename,
lang: lang,
from: detection.language
};
return publishResult(topicName, messageData);
});
return Promise.all(tasks);
});
}
之后,我只想将detectec文本保存到文件中,如下面的代码所示:
/**
* Saves the data packet to a file in GCS. Triggered from a message on a Pub/Sub
* topic.
*
* @param {object} event The Cloud Functions event.
* @param {object} event.data The Cloud Pub/Sub Message object.
* @param {string} event.data.data The "data" property of the Cloud Pub/Sub
* Message. This property will be a base64-encoded string that you must decode.
*/
exports.saveResult = (event) => {
const pubsubMessage = event.data;
const jsonStr = Buffer.from(pubsubMessage.data, 'base64').toString();
const payload = JSON.parse(jsonStr);
return Promise.resolve()
.then(() => {
if (!payload.text) {
throw new Error('Text not provided. Make sure you have a "text" property in your request');
}
if (!payload.filename) {
throw new Error('Filename not provided. Make sure you have a "filename" property in your request');
}
if (!payload.lang) {
throw new Error('Language not provided. Make sure you have a "lang" property in your request');
}
console.log(`Received request to save file ${payload.filename}`);
const bucketName = config.RESULT_BUCKET;
const filename = renameImageForSave(payload.filename, payload.lang);
const file = storage.bucket(bucketName).file(filename);
console.log(`Saving result to ${filename} in bucket ${bucketName}`);
return file.save(payload.text);
})
.then(() => {
console.log(`File saved.`);
});
};
答案 0 :(得分:1)
因此,那里的教程基于更加“复杂”的设置(也使用Pub Sub和Translate),并且您只想提取文本,因此,您应该能够:
'use strict';
const Storage = require('@google-cloud/storage');
const Vision = require('@google-cloud/vision');
const bucketName = 'YOUR_BUCKET';
const srcFilename = 'YOUR_IMAGE.jpg';
const projectId = 'YOUR_PROJECT_ID';
const storage = new Storage({
projectId: projectId
});
const vision = new Vision.ImageAnnotatorClient({
projectId: projectId
});
exports.processImage = (req, res) => {
let text;
vision.textDetection(`gs://${bucketName}/${srcFilename}`)
.then(([detections]) => {
const annotation = detections.textAnnotations[0];
text = annotation ? annotation.description : '';
console.log(`Extracted text: ${text}`);
console.log(`Extracted text from image (${text.length} chars)`);
}).catch(vis_err => {
console.error("Vision error:" , vis_err);
});
res.status(200).send("OK");
}
我的依存关系,在我的package.json
文件中:
"dependencies": {
"@google-cloud/vision": "0.21.0"
},
如果需要,您以后可以扩展它以将文本保存到存储中。还有其他有关如何执行此操作的教程。