You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:28:12