从人巡到云巡:AI 视觉在智慧养殖中的应用——自动巡栏、体温监测、猪只盘点

从人巡到云巡:AI 视觉在智慧养殖中的应用——自动巡栏、体温监测、猪只盘点

系列:乐橙接入实战 · 智慧养殖篇
封面:imou-smart-farm-csdn-cover-orange.png
文档:乐橙云开发文档 · 注册:乐橙开放平台

协议说明:本文仅使用当前维护的 OpenAPI(域名 openapi.lechange.cn,请求体含 system + params,见开发规范)。文档中的「旧版本协议」栏目已声明后续不再维护,请勿在新项目中引用该模块下的接口;下文代码与链接均来自现行文档。


皖北一个 1200 头的育肥场,夜班师傅老张骑电动车巡了六圈,回到值班室才发现——3 号栏红外报警早就响了,他漏看了一格。老板算过账:人巡 4 小时一轮,覆盖率不到 60%,一场非瘟疑似就是百万级损失。 后来我们把乐橙 4G 云台摄像机接上开放平台,告警秒推、云端自动巡航、异常截图可搜——老张的工作从「跑断腿」变成了「看大屏」。


为什么智慧养殖现在值得用视频 AI 重做?

养殖数字化的瓶颈往往不是「有没有摄像头」,而是:

传统人巡云巡 + AI
频次低、漏检高7×24 消息推送 + 定时巡航
异常靠肉眼、难留证告警联动截图/云录像 + MP4 归档
体温/采食靠经验热成像 heatImagingTemper + IoT 环境传感
盘点靠人工点数拌线 crossLineDetection + AI 智见检索辅助

乐橙云直播官方适用场景明确包含智慧农业 & 养殖;户外无网场景可配 4G 云台机(如 TS1FT 系列)。开放平台提供设备接入、云直播、消息推送、PTZ 控制、AI 智见检索等能力,开发者可在自有 SaaS 里编排「云巡栏」逻辑。

先厘清边界:平台给什么,你要拼什么

乐橙侧:设备上云 + 告警产生 + 直播/回放 + PTZ/巡航 + AI 标签/语义检索
开发者侧:栏位映射 + 告警分级 + 工单/短信 + 盘点统计 + 与 ERP 对接

诚实说明「猪只盘点」:乐橙暂无独立的「数猪 API」。实战路径是:

  1. 栏位进出口部署支持拌线能力的设备,收 crossLineDetection 事件做进栏/出栏计数
  2. 开通 AI 智见套餐 后,用 searchAiAlarmMessageByPage 按「猪」「栏位活动」等关键词检索告警快照
  3. 告警 picurlArray 对接自有视觉模型做二次识别(平台负责采集与推送)

体温监测同理:热成像设备推送 heatImagingTemper事件消息类型),是异常热区告警,非兽用精准体温计——需与兽医流程结合解读。

总体架构

开发者养殖 SaaS

乐橙云平台

养殖场边缘

HTTP POST

bindDeviceLive

controlMovePTZ

4G/有线 PTZ 摄像机

IoT 温湿度传感器

告警/IoT 消息

云直播 HLS

AI 智见分析

消息回调服务

巡栏大屏

存栏/工单系统


1. 项目骨架与设备接入

smart-farm-imou/
├── .env
├── src/
│   ├── imou-client.js       # OpenAPI 签名
│   ├── alarm-router.js      # 告警分类路由
│   ├── patrol-service.js    # 云巡栏 PTZ
│   └── inventory-service.js # 栏位计数/AI 检索
└── server/
    └── callback-server.js   # 接收乐橙推送

设备绑定走现行流程(接入指南):App 扫码 / 控制台添加 / bindDeviceOpenApi。上线前用能力集确认设备支持所需功能:

const data = await callOpenApi('listDeviceAbility', appId, appSecret, {
  token,
  deviceList: [{ deviceId: 'TESTQWERXXXX', channelList: '0' }],
});

const ability = data.deviceList[0].channels[0].channelAbility;
const supports = (key) => ability.includes(key);

console.log('PTZ:', supports('PT'));
console.log('TimedCruise:', supports('TimedCruise'));
console.log('AiHuman:', supports('AiHuman'));

能力定义见设备能力集踩坑 A:买了固定枪机却调 controlMovePTZ,返回成功但画面不动——先查 PT 能力。

2. 注册消息回调:养殖告警总入口

await callOpenApi('setMessageCallback', appId, appSecret, {
  token,
  status: 'on',
  callbackUrl: 'https://your-farm-saas.com/imou/callback',
  callbackFlag: 'alarm,deviceStatus,iot,faceAnalysis',
  basePush: '2',
});

回调路由:

// src/alarm-router.js
const FARM_RULES = {
  heatImagingTemper: { level: 'P0', action: 'fever_check',   label: '热成像温度异常' },
  human:             { level: 'P1', action: 'intruder_alert', label: '有人进入栏区' },
  crossLineDetection:{ level: 'P2', action: 'count_inventory', label: '拌线穿越' },
  videoBlind:        { level: 'P1', action: 'camera_fault',  label: '镜头遮挡' },
  offline:           { level: 'P0', action: 'device_offline', label: '设备离线' },
  highTemAbnormal:   { level: 'P1', action: 'env_hot',       label: '环境温度过高' },
  lowTemAbnormal:    { level: 'P1', action: 'env_cold',      label: '环境温度过低' },
};

export function routeFarmAlarm(msg) {
  if (msg.msgType === 'online' || msg.msgType === 'offline') {
    return { ...FARM_RULES.offline, msgType: msg.msgType, deviceId: msg.did };
  }
  const rule = FARM_RULES[msg.msgType];
  if (!rule) return { level: 'P3', action: 'log_only', label: msg.msgType, raw: msg };
  return {
    ...rule,
    deviceId: msg.did,
    channelId: msg.cid,
    alarmId: msg.id,
    timestamp: msg.time,
    token: msg.token,
  };
}
app.post('/imou/callback', (req, res) => {
  res.status(200).send('OK');
  const event = routeFarmAlarm(req.body);
  if (event.action === 'count_inventory') inventoryService.onCrossLine(event);
  else if (event.level === 'P0') notifyService.urgent(event);
  db.insert('farm_events', event);
});

踩坑 B:回调不及时回 200,平台会停推——养殖场景告警密集,务必异步处理。

3. 云巡栏:PTZ 程序化巡航 + 远程直播

3.1 远程看栏(辅码流省 4G 流量)
const { streams } = await callOpenApi('bindDeviceLive', appId, appSecret, {
  token,
  deviceId: 'TESTQWERXXXX',
  channelId: '0',
  streamId: 1,
  liveMode: 'proxy',
});
const hlsUrl = streams[0].hls;
3.2 程序化 PTZ 巡栏脚本
const PATROL_PATH = [
  { operation: '2', duration: 3000 },
  { operation: '0', duration: 2000 },
  { operation: '10', duration: 500 },
  { operation: '3', duration: 3000 },
  { operation: '1', duration: 2000 },
  { operation: '10', duration: 500 },
];

export async function runPatrolRound(appId, appSecret, token, deviceId, channelId) {
  for (const step of PATROL_PATH) {
    await callOpenApi('controlMovePTZ', appId, appSecret, {
      token, deviceId, channelId: String(channelId),
      operation: step.operation,
      duration: String(step.duration),
    });
    await sleep(step.duration + 500);
  }
}

controlMovePTZoperation 0–7 为方向,10 为停止。

踩坑 C:连续 PTZ 不插 operation: 10 停止,部分设备会指令堆积、云台卡死。

3.3 设备侧定时巡航

若能力集含 TimedCruise,可用 setCruiseConfig / turnCollection 在设备端配置收藏点巡航——适合固定路线栏位,API 调用量更低。

4. 体温 / 热异常监测

function handleIotEvent(msg) {
  if (msg.msgType !== 'iotEvent') return;
  const { event, outputData } = msg.content ?? {};
  farmMetrics.record(msg.did, { event, outputData, time: msg.time });
}
const data = await callOpenApi('getAlarmMessage', appId, appSecret, {
  token,
  deviceId: 'TESTQWERXXXX',
  channelId: '0',
  beginTime: '2025-06-22 00:00:00',
  endTime: '2025-06-22 23:59:59',
  count: 30,
  nextAlarmId: '-1',
});

for (const a of data.alarms ?? []) {
  if (a.aiCopyWriting) {
    console.log(a.localDate, a.aiCopyWriting, a.aiTag, a.securityRiskLevel);
  }
}

踩坑 DheatImagingTemper热成像异常事件,展示应写「热区异常,建议现场复核」,而非精确兽用体温。

5. 猪只盘点:拌线计数 + AI 语义检索

5.1 拌线穿越计数
const penCounters = new Map();

export function onCrossLine(event) {
  const penId = `${event.deviceId}_${event.channelId}`;
  const c = penCounters.get(penId) ?? { in: 0, out: 0 };
  c.in += 1;
  penCounters.set(penId, c);
  db.upsert('pen_inventory_estimate', {
    penId,
    estimate: c.in - c.out,
    updatedAt: new Date(),
  });
}
5.2 AI 智见:按自然语言搜栏位活动
const result = await callOpenApi('searchAiAlarmMessageByPage', appId, appSecret, {
  token,
  deviceId: 'TESTQWERXXXX',
  channelId: '0',
  beginTime: '2025-06-22 06:00:00',
  endTime: '2025-06-22 08:00:00',
  searchContent: '栏位内猪只活动',
  pageSize: '20',
  sortType: '2',
});

searchAiAlarmMessageByPage需 AI 智见套餐

踩坑 EpicurlArray 图片最长保存 1 天——盘点截图须异步落自有 OSS。

6. 巡栏大屏:一栏一设备映射

const PENS = [
  { penId: 'A-01', deviceId: 'DEV001', channelId: '0', name: '1号育肥栏' },
  { penId: 'A-02', deviceId: 'DEV002', channelId: '0', name: '2号育肥栏' },
];

async function buildDashboard(token) {
  const rows = [];
  for (const pen of PENS) {
    const live = await callOpenApi('bindDeviceLive', appId, appSecret, {
      token, deviceId: pen.deviceId, channelId: pen.channelId, streamId: 1,
    });
    rows.push({ ...pen, hls: live.streams[0].hls, coverUrl: live.streams[0].coverUrl });
  }
  return rows;
}

7. 端到端验证清单

步骤操作预期
1listDeviceAbilityPTAlarmMDAiHuman
2setMessageCallbackcode=0
3栏内走动触发人形回调 msgType=human
4controlMovePTZ 一轮画面方位变化
5bindDeviceLive streamId=14G 下 3–8s 出画
6searchAiAlarmMessageByPage智见套餐下返回 aiCopyWriting

边界讨论

场景建议
无网猪舍4G 摄像机 + 辅码流 + 告警推送为主,直播按需拉
精准存栏拌线估算 + 定期人工抽检;深度识别接自有模型
非瘟等重大疫情热成像作辅助,不能替代官方检疫流程
多租户 SaaS子账户 token + 栏位级 Permission: Alarm/Ptz
夜间巡检全彩/微光机型 + human 过滤,降低误报

性能与成本

  • 4G 流量:巡栏以「告警驱动 + 定时快照」为主,7×24 高清直播会快速耗尽 1Mbps 带宽额度
  • 消息峰值:喂料、换班时段告警密集,回调层用队列削峰
  • AI 套餐:按栏位数开通智见,避免全场全开造成检索成本浪费
  • 云转存留证:关键 heatImagingTemper 告警可联动 createProjectTask 转 MP4 归档

生产注意事项

  1. 栏位与 deviceId/channelId 映射放配置中心,勿硬编码
  2. P0 告警(热成像、离线)走电话提醒 + 工单双通道
  3. 定期 refreshDeviceCover 更新封面,大屏离线格展示 coverUrl
  4. 固定枪机场景用「多点位摄像机」替代 PTZ 巡航,更稳定

总结

智慧养殖的「从人巡到云巡」,本质是三类能力在开放平台上的组合:

  • 看见bindDeviceLive / 轻应用 → 远程看栏
  • 知异常setMessageCallback + human / heatImagingTemper / crossLineDetection → 秒级感知
  • 能追溯getAlarmMessage / searchAiAlarmMessageByPage + 云转存 → 留证与复盘

延伸阅读

开始动手

如果你在做智慧养殖、畜牧物联网、农业视觉巡检,一台 4G 云台机 + 开放平台消息回调 就是最小可行云巡栏。乐橙开放平台(open.imou.com) 以视频技术和安全为核心,开放低代码开发组件,一站式助力第三方厂商与个人开发者快速、低成本落地视频场景应用。新用户注册可领取 10 路设备额度1Mbps 带宽

👉 注册入口https://open.imou.com → 开发中心 → 绑定设备 → 对接 setMessageCallback + controlMovePTZ

建议先在一个栏位走通:人走进栏区 → 手机收到 human 告警 → 大屏点开辅码流直播 → 手动 PTZ 转一圈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值