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:
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user