feat(aiot): 添加算法抽帧频率选择器

功能特性:
- 新增抽帧频率参数映射和选择器
- 7个预设选项:10帧/秒到1帧/30秒
- 每个选项带有场景说明和适用描述
- 美观的下拉选择界面,清晰展示频率和用途

抽帧频率选项(物业场景优化):
1. 10帧/秒 - 高频检测,快速移动场景
2. 5帧/秒 - 中高频,正常人员活动
3. 3帧/秒 - 中频,人员离岗、聚集(离岗推荐)
4. 1帧/秒 - 标准频率,周界入侵(入侵推荐)
5. 1帧/3秒 - 低频,慢速场景
6. 1帧/10秒 - 极低频,车辆检测
7. 1帧/30秒 - 超低频,垃圾堆放等静态检测

界面优化:
- 下拉选项采用双行显示(频率+说明)
- 参数说明提示算法处理频率的影响
- 自动显示默认值对应的频率标签

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-13 17:15:10 +08:00
parent e90ffec8c8
commit b0ea479493

View File

@@ -44,6 +44,7 @@ const newListItem = ref('');
// 参数名中英文映射
const paramNameMap: Record<string, string> = {
leave_countdown_sec: '离岗倒计时(秒)',
frame_rate: '抽帧频率',
working_hours: '工作时间段',
// 其他算法参数
cooldown_seconds: '告警冷却期(秒)',
@@ -58,12 +59,24 @@ const paramNameMap: Record<string, string> = {
// 参数说明映射
const paramDescMap: Record<string, string> = {
leave_countdown_sec: '人员离开后,倒计时多少秒才触发离岗告警',
frame_rate: '算法处理视频流的频率,频率越高检测越及时但消耗越大',
working_hours: '仅在指定时间段内进行监控留空表示24小时监控',
// 其他算法参数说明
cooldown_seconds: '触发告警后,多少秒内不再重复告警(用于周界入侵等算法)',
confirm_seconds: '检测到目标后,持续多少秒才触发告警(避免瞬间误报)',
};
// 抽帧频率选项(物业场景优化)
const frameRateOptions = [
{ value: 10.0, label: '10帧/秒', desc: '高频检测 - 快速移动场景' },
{ value: 5.0, label: '5帧/秒', desc: '中高频 - 正常人员活动' },
{ value: 3.0, label: '3帧/秒', desc: '中频 - 人员离岗、聚集(推荐)' },
{ value: 1.0, label: '1帧/秒', desc: '标准频率 - 周界入侵(推荐)' },
{ value: 0.33, label: '1帧/3秒', desc: '低频 - 慢速场景' },
{ value: 0.1, label: '1帧/10秒', desc: '极低频 - 车辆检测' },
{ value: 0.03, label: '1帧/30秒', desc: '超低频 - 垃圾堆放等静态检测' },
];
// 获取参数的中文名称
function getParamLabel(key: string): string {
return paramNameMap[key] || key;
@@ -129,6 +142,17 @@ function isWorkingHoursField(key: string): boolean {
return key === 'working_hours';
}
// 判断是否为抽帧频率字段
function isFrameRateField(key: string): boolean {
return key === 'frame_rate';
}
// 获取抽帧频率显示文本
function getFrameRateLabel(value: number): string {
const option = frameRateOptions.find(opt => Math.abs(opt.value - value) < 0.01);
return option ? option.label : `${value}帧/秒`;
}
async function handleSave() {
try {
console.log('[算法参数保存] 开始保存,原始数据:', formData.value);
@@ -273,6 +297,29 @@ function validateParams(params: Record<string, any>): {
</div>
</template>
<!-- 抽帧频率特殊处理 -->
<template v-else-if="isFrameRateField(String(key))">
<Select
v-model:value="formData[String(key)]"
:placeholder="`默认: ${getFrameRateLabel(schema.default)}`"
style="width: 100%"
>
<Select.Option
v-for="option in frameRateOptions"
:key="option.value"
:value="option.value"
>
<div style="display: flex; flex-direction: column;">
<span style="font-weight: 500;">{{ option.label }}</span>
<span style="font-size: 12px; color: #8c8c8c;">{{ option.desc }}</span>
</div>
</Select.Option>
</Select>
<div v-if="getParamDesc(String(key))" class="param-desc">
{{ getParamDesc(String(key)) }}
</div>
</template>
<!-- 普通列表类型 -->
<div v-else-if="schema.type === 'list'">
<div style="margin-bottom: 8px">