从人巡到云巡: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」。实战路径是:
- 栏位进出口部署支持拌线能力的设备,收
crossLineDetection事件做进栏/出栏计数 - 开通 AI 智见套餐 后,用
searchAiAlarmMessageByPage按「猪」「栏位活动」等关键词检索告警快照 - 告警
picurlArray对接自有视觉模型做二次识别(平台负责采集与推送)
体温监测同理:热成像设备推送 heatImagingTemper(事件消息类型),是异常热区告警,非兽用精准体温计——需与兽医流程结合解读。
总体架构
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);
}
}
controlMovePTZ:operation 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);
}
}
踩坑 D:heatImagingTemper 是热成像异常事件,展示应写「热区异常,建议现场复核」,而非精确兽用体温。
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 智见套餐。
踩坑 E:picurlArray 图片最长保存 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. 端到端验证清单
| 步骤 | 操作 | 预期 |
|---|---|---|
| 1 | listDeviceAbility | 含 PT、AlarmMD 或 AiHuman |
| 2 | setMessageCallback | code=0 |
| 3 | 栏内走动触发人形 | 回调 msgType=human |
| 4 | controlMovePTZ 一轮 | 画面方位变化 |
| 5 | bindDeviceLive streamId=1 | 4G 下 3–8s 出画 |
| 6 | searchAiAlarmMessageByPage | 智见套餐下返回 aiCopyWriting |
边界讨论
| 场景 | 建议 |
|---|---|
| 无网猪舍 | 4G 摄像机 + 辅码流 + 告警推送为主,直播按需拉 |
| 精准存栏 | 拌线估算 + 定期人工抽检;深度识别接自有模型 |
| 非瘟等重大疫情 | 热成像作辅助,不能替代官方检疫流程 |
| 多租户 SaaS | 子账户 token + 栏位级 Permission: Alarm/Ptz |
| 夜间巡检 | 全彩/微光机型 + human 过滤,降低误报 |
性能与成本
- 4G 流量:巡栏以「告警驱动 + 定时快照」为主,7×24 高清直播会快速耗尽 1Mbps 带宽额度
- 消息峰值:喂料、换班时段告警密集,回调层用队列削峰
- AI 套餐:按栏位数开通智见,避免全场全开造成检索成本浪费
- 云转存留证:关键
heatImagingTemper告警可联动createProjectTask转 MP4 归档
生产注意事项
- 栏位与
deviceId/channelId映射放配置中心,勿硬编码 - P0 告警(热成像、离线)走电话提醒 + 工单双通道
- 定期
refreshDeviceCover更新封面,大屏离线格展示coverUrl - 固定枪机场景用「多点位摄像机」替代 PTZ 巡航,更稳定
总结
智慧养殖的「从人巡到云巡」,本质是三类能力在开放平台上的组合:
- 看见:
bindDeviceLive/ 轻应用 → 远程看栏 - 知异常:
setMessageCallback+human/heatImagingTemper/crossLineDetection→ 秒级感知 - 能追溯:
getAlarmMessage/searchAiAlarmMessageByPage+ 云转存 → 留证与复盘
延伸阅读
开始动手
如果你在做智慧养殖、畜牧物联网、农业视觉巡检,一台 4G 云台机 + 开放平台消息回调 就是最小可行云巡栏。乐橙开放平台(open.imou.com) 以视频技术和安全为核心,开放低代码开发组件,一站式助力第三方厂商与个人开发者快速、低成本落地视频场景应用。新用户注册可领取 10 路设备额度 和 1Mbps 带宽。
👉 注册入口:https://open.imou.com → 开发中心 → 绑定设备 → 对接 setMessageCallback + controlMovePTZ
建议先在一个栏位走通:人走进栏区 → 手机收到 human 告警 → 大屏点开辅码流直播 → 手动 PTZ 转一圈。
1401

被折叠的 条评论
为什么被折叠?



