树莓派NodeJS应用如何向Azure API上传图片实现文字识别(替代JQuery)
在树莓派上用Node.js直接调用Azure文字识别API识别水表读数
没问题,咱直接跳过网页那套,用Node.js在树莓派上完成拍照+调用Azure API的全流程,完全不用浏览器操作。下面给你一步步来:
先准备好这些东西
- 你的Azure认知服务(文字识别)的密钥和端点(在Azure门户里能找到,记得选Read API的端点)
- 树莓派已经装好Node.js,并且
pi-camera模块已经在用了 - 安装两个额外的依赖:
axios(用来发HTTP请求),你习惯用node-fetch也可以
第一步:安装依赖
打开树莓派的终端,运行:
npm install axios
第二步:编写完整代码
下面是整合了拍照、调用API、解析结果的代码,你可以直接用,记得替换成自己的Azure密钥和端点:
const PiCamera = require('pi-camera'); const axios = require('axios'); const fs = require('fs').promises; // 1. 配置相机参数(根据你的需求调整) const camera = new PiCamera({ mode: 'photo', output: `${__dirname}/water_meter.jpg`, width: 1280, height: 720, nopreview: true, // 树莓派上不用预览,省资源 }); // 2. Azure文字识别API配置 const AZURE_KEY = '你的Azure文字识别密钥'; const AZURE_ENDPOINT = '你的Azure端点(比如https://xxx.cognitiveservices.azure.com/)'; // 用Read API v3.1,专门识别印刷体,适合水表读数 const READ_API_URL = `${AZURE_ENDPOINT}/vision/v3.1/read/analyze`; // 3. 拍照函数 async function takePhoto() { try { await camera.snap(); console.log('照片拍摄完成:water_meter.jpg'); return `${__dirname}/water_meter.jpg`; } catch (err) { console.error('拍照出错:', err); throw err; } } // 4. 调用Azure文字识别API async function callAzureOCR(imagePath) { try { // 读取照片为二进制Buffer const imageBuffer = await fs.readFile(imagePath); // 发送请求到Azure API const response = await axios.post( READ_API_URL, imageBuffer, { headers: { 'Ocp-Apim-Subscription-Key': AZURE_KEY, 'Content-Type': 'application/octet-stream' } } ); // Read API是异步的,需要用返回的operation-location去获取结果 const operationUrl = response.headers['operation-location']; // 等待几秒让Azure处理图片(根据图片大小调整,一般2-5秒足够) await new Promise(resolve => setTimeout(resolve, 3000)); // 获取识别结果 const resultResponse = await axios.get(operationUrl, { headers: { 'Ocp-Apim-Subscription-Key': AZURE_KEY } }); return resultResponse.data; } catch (err) { console.error('调用Azure API出错:', err.response?.data || err.message); throw err; } } // 5. 解析识别结果,提取水表读数 function extractMeterReading(ocrResult) { // 检查识别状态是否成功 if (ocrResult.status !== 'succeeded') { return '识别失败,请检查图片或API配置'; } // 提取所有识别到的文本行 const allText = ocrResult.analyzeResult.readResults[0].lines.map(line => line.text).join(' '); // 过滤出水表的数字(假设读数是纯数字,比如1234.56) const meterMatch = allText.match(/\d+\.?\d*/); if (meterMatch) { return `水表读数:${meterMatch[0]}`; } else { return '未识别到有效读数,请调整拍照角度或光线'; } } // 主函数:串联所有步骤 async function main() { try { const photoPath = await takePhoto(); const ocrResult = await callAzureOCR(photoPath); const reading = extractMeterReading(ocrResult); console.log(reading); } catch (err) { console.error('流程出错:', err); } } // 启动程序 main();
关键注意事项
- Azure API版本:用Read API而不是旧的OCR API,因为它对印刷体的识别更准确,尤其是水表这种场景
- 异步处理:Read API是异步的,所以需要先发请求获取任务地址,再等一会儿去拿结果,代码里的3秒延时可以根据实际情况调整
- 拍照参数:如果识别效果不好,可以调整照片的分辨率、光线(比如给树莓派加个补光灯)、拍摄角度,尽量让水表读数清晰、无反光
- 树莓派权限:确保运行Node.js的用户有相机权限(可以用
sudo usermod -a -G video pi给pi用户加权限),还有读写照片文件的权限
这样你直接运行这个Node.js脚本,就能自动拍照、调用Azure识别,最后输出水表读数了,完全不用网页那一套~
内容的提问来源于stack exchange,提问作者Larry V
相关产品推荐
相关产品推荐

