package vqdcms import ( "database/sql/driver" "encoding/json" "time" ) type Abnormal struct { Value float32 `json:"value"` Name string `json:"name"` } type abnormal []Abnormal func (r *abnormal) Scan(val interface{}) error { b, _ := val.([]byte) return json.Unmarshal(b, r) } func (r abnormal) Value() (driver.Value, error) { return json.Marshal(r) } type DefaultValue struct { Thr1 float32 `json:"thr1"` Name1 string `json:"name1"` Thr2 float32 `json:"thr2"` Name2 string `json:"name2"` Ratio float32 `json:"ratio"` //比例 } type defaultValue []DefaultValue func (r *defaultValue) Scan(val interface{}) error { b, _ := val.([]byte) return json.Unmarshal(b, r) } func (r defaultValue) Value() (driver.Value, error) { return json.Marshal(r) } type AbnormalModel struct { ID int `gorm:"primary_key" json:"id"` ChannelID string `json:"channel_id"` ChannelName string `json:"channel_name"` AlgoID int `json:"algo_id"` AlgoName string `json:"algo_name"` TaskName string `json:"task_name"` FilePath string `json:"file_path"` IsDeep bool `json:"is_deep"` Abnormals abnormal `gorm:"type:json" json:"abnormals"` DefaultValues defaultValue `gorm:"type:json" json:"default_values"` //设置的默认阈值 CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } /* 偏色参数 */ type VQDColorPara struct { ColorThr float32 /* 偏色判断值,*/ /* 偏色次数比例, 默认为0.5, 取值范围: 0~1, 建议范围: 0.1~0.9 */ ColorAbnNumRatio float32 Resverd1 float32 /* 保留,暂时不设置,默认 -999 */ Resverd2 float32 /* 保留,暂时不设置,默认 -999 */ Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } /* 亮暗参数 */ // OK type VQDLgtDarkPara struct { /* 超过200的像素比例,过亮阈值, 默认 0.1, 取值范围: 0~1, 建议范围: 0.1~0.5, 值设置的越大, 越不灵敏, 就是非常亮才算过亮 值设置的越小, 越灵敏, 太小的话误报会很多 */ LightThr float32 /* 低于55的像素比例,过暗阈值, 默认 0.4, 取值范围: 0~1, 建议范围: 0.2~0.6 值设置的越大, 越不灵敏, 就是非常暗才算过暗 值设置的越小, 越灵敏, 太小的话误报会很多 */ DarkThr float32 /* 偏暗或者偏亮次数比例, 连续多次检测出现的次数比例 默认为0.5, 取值范围: 0~1, 建议范围: 0.1~0.9 */ LgtDarkAbnNumRatio float32 Resverd1 float32 /* 保留,暂时不设置,默认 -999 */ Resverd2 float32 /* 保留,暂时不设置,默认 -999 */ Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } /* 清晰度参数 */ // OK type VQDClarityPara struct { /* 清晰度判断阈值, 小于该值判定为模糊, 默认为0.4, 取值范围: 0~1, 建议范围: 0.3~0.99 值设置的越大, 越不灵敏, 太大的话误报模糊会很多 值设置的越小, 就是非常模糊才算模糊 */ ClarityThr float32 /* 清晰度异常次数比例, 默认为0.5, 取值范围: 0~1, 建议范围: 0.1~0.9 */ ClarityAbnNumRatio float32 Resverd1 float32 /* 保留,暂时不设置,默认 -999 */ Resverd2 float32 /* 保留,暂时不设置,默认 -999 */ Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } /* 噪声参数 */ type VQDNoisePara struct { NoiseThr float32 /* 噪声判断阈值,默认为 35 */ /* 噪声次数比例, 默认为0.5, 取值范围: 0~1, 建议范围: 0.1~0.9 */ NoiseAbnNumRatio float32 Resverd1 float32 /* 保留,暂时不设置,默认 -999 */ Resverd2 float32 /* 保留,暂时不设置,默认 -999 */ Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } /* 对比度参数 */ type VQDContrastPara struct { CtraLowThr float32 /* 低对比度判断阈值,默认为 30 */ CtraHighThr float32 /* 高对比度判断阈值,默认为 120 */ /* 对比度异常次数比例, 默认为0.5, 取值范围: 0~1, 建议范围: 0.1~0.9 */ CtraAbnNumRatio float32 Resverd1 float32 /* 保留,暂时不设置,默认 -999 */ Resverd2 float32 /* 保留,暂时不设置,默认 -999 */ Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } /* 遮挡参数 */ type VQDOcclusionPara struct { OcclusionThr float32 /* 遮挡判断阈值,默认为 6 */ /* 遮挡次数比例 默认为0.5, 取值范围: 0~1, 建议范围: 0.1~0.9 */ OcclusionAbnNumRatio float32 Resverd1 float32 /* 保留,暂时不设置,默认 -999 */ Resverd2 float32 /* 保留,暂时不设置,默认 -999 */ Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } /* 蓝屏参数 */ // OK type VQDBluePara struct { /* 蓝屏判断阈值, 蓝色像素占图像面积比例, 默认为 0.6, 取值范围: 0~1, 建议范围 0.4~0.9 */ BlueThr float32 /* 蓝屏次数比例, 连续多帧中蓝色占比 默认为0.5, 取值范围: 0~1, 建议范围: 0.1~0.9 */ BlueAbnNumRatio float32 Resverd1 float32 /* 保留,暂时不设置,默认 -999 */ Resverd2 float32 /* 保留,暂时不设置,默认 -999 */ Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } /* 抖动参数, 做抖动检测, 尽量隔帧取帧做, */ // OK type VQDSharkPara struct { /* 抖动阈值参数 全局运动均值, 无论是目标移动还是画面抖动, 全局运动均值相对来讲都会比较大, 默认为 0.2, 取值范围: 0~10, 建议范围: 0.1~0.8 */ SharkThr float32 /* 出现抖动次数的比例, 默认为0.2, 取值范围: 0~1, 建议范围: 0.1~0.6 */ SharkAbnNumRatio float32 /* 全局运动幅度方差阈值, 理论上来讲, 抖动为全局画面移动, 方向幅度具有一致性, 方差应较小 默认为0.2, 取值范围: 0~1, 建议范围: 0.05~0.5 如果内部有很多运动目标, 该值较大, 所以设置较大, 会使得在有运动目标时, 判定为抖动 */ Resverd1 float32 /* 全局运动方向方差阈值, 小于该值时, 判定为全局运动, 可能会抖动 默认为0.2, 取值范围: 0~1, 建议范围: 0.05~0.5 如果内部有很多运动目标, 该值较大, 所以设置较大, 会使得在有运动目标时, 判定为抖动 */ Resverd2 float32 Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } /* 冻结参数 */ // OK type VQDFreezePara struct { /* 冻结阈值参数 静止的像素比例, 默认为0.999, 取值范围: 0.8~1, 建议范围: 0.99~1 如果画面静止, 该值比较大, 甚至会接近于1, */ FreezeThr float32 /* 冻结阈值 */ /* 冻结帧数占得比例, 尽量设置的大一些, 避免那些无运动目标的静止监控画面 默认为0.99, 取值范围: 0.8~1, 建议范围: 0.95~1, */ FreezeAbnNumRatio float32 Resverd1 float32 /* 保留,暂时不设置,默认 -999 */ Resverd2 float32 /* 保留,暂时不设置,默认 -999 */ Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } /* 马赛克检测 NEW: 新增深度学习版本 2.0.0 */ type VQDMosaicPara struct { /* 马赛克阈值参数 NEW: 新增深度学习版本 20240717 默认为 0.1 取值范围: 0~1, 建议范围: 0.1~0.9, 大于该值判定为偏色, 小于该值判定为正常, */ MosaicThr float32 /* 马赛克次数比例, 连续多帧中马赛克占比 默认为0.5,取值范围: 0~1, 建议范围: 0.3 连续多帧中马赛克占比 */ MosaicAbnNumRatio float32 Resverd1 float32 /* 保留,暂时不设置,默认 -999 */ Resverd2 float32 /* 保留,暂时不设置,默认 -999 */ Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } /* 花屏检测 NEW NEW NEW NEW NEW NEW: 新增深度学习版本 2.0.0 */ type VQDFlowerPara struct { /* 花屏阈值参数 NEW: 新增深度学习版本 20240717 默认为 0.1 取值范围: 0~1, 建议范围: 0.1~0.9, 大于该值判定为偏色, 小于该值判定为正常, */ FlowerThr float32 /* 花屏次数比例, 连续多帧中花屏占比 默认为0.5, 取值范围: 0~1, 建议范围: 0.3 连续多帧中花屏占比 */ FlowerAbnNumRatio float32 Resverd1 float32 /* 保留,暂时不设置,默认 -999 */ Resverd2 float32 /* 保留,暂时不设置,默认 -999 */ Resverd3 float32 /* 保留,暂时不设置,默认 -999 */ } type VQDPara struct { VecFrmNum int /* 连续分析帧数(2-64), 默认为10, 最大为 64 */ UseDeepLearning bool /* 是否使用深度学习版本, 默认使用深度学习版本 NEW: 20240717 */ EnableFunc int /* 功能使能,默认为 NXU_VQD_ENABLE_ALL,多项功能用或 */ ColorPara VQDColorPara /* 偏色参数 */ LgtDarkPara VQDLgtDarkPara /* 亮暗参数 */ ClarityPara VQDClarityPara /* 清晰度参数 */ NoisePara VQDNoisePara /* 噪声参数 */ ContrastPara VQDContrastPara /* 对比度参数 */ OcclusionPara VQDOcclusionPara /* 遮挡参数 */ BluePara VQDBluePara /* 蓝屏参数 */ SharkPara VQDSharkPara /* 抖动参数 */ FreezePara VQDFreezePara /* 冻结参数 */ MosaicPara VQDMosaicPara /* 马赛克检测 */ FlowerPara VQDFlowerPara /* 花屏检测 */ } // config cvrdo.VQDAlgoConfig func NewVQDPara() VQDPara { return VQDPara{ VecFrmNum: 2, UseDeepLearning: true, EnableFunc: GetAlgoEnable([]string{"vqd_config", "vqd_lgt_dark", "vqd_blue", "vqd_clarity", "vqd_shark", "vqd_freeze", "vqd_color", "vqd_occlusion", "vqd_noise", "vqd_contrast", "vqd_mosaic", "vqd_flower"}), ColorPara: VQDColorPara{ ColorThr: 0.3, ColorAbnNumRatio: 0.6, }, LgtDarkPara: VQDLgtDarkPara{ LightThr: 0.3, DarkThr: 0.4, LgtDarkAbnNumRatio: 0.6, }, ClarityPara: VQDClarityPara{ ClarityThr: 0.5, ClarityAbnNumRatio: 0.6, }, NoisePara: VQDNoisePara{ NoiseThr: 0.3, NoiseAbnNumRatio: 0.6, }, ContrastPara: VQDContrastPara{ CtraLowThr: 0.3, CtraHighThr: 0.8, CtraAbnNumRatio: 0.6, }, OcclusionPara: VQDOcclusionPara{ OcclusionThr: 0.1, OcclusionAbnNumRatio: 0.6, }, BluePara: VQDBluePara{ BlueThr: 0.3, BlueAbnNumRatio: 0.6, }, SharkPara: VQDSharkPara{ SharkThr: 0.2, SharkAbnNumRatio: 0.2, }, FreezePara: VQDFreezePara{ FreezeThr: 0.999, FreezeAbnNumRatio: 0.99, }, MosaicPara: VQDMosaicPara{ MosaicThr: 0.3, MosaicAbnNumRatio: 0.6, }, FlowerPara: VQDFlowerPara{ FlowerThr: 0.3, FlowerAbnNumRatio: 0.6, }, } } /* 异常结果 当前各异常返回出来的值,作为参考,外面也可以存到列表中进行应用 */ type VQDResult struct { AbnormalType int /* 异常类型,多种类型的,利用与或来确定异常类型 */ ColorDev float32 /* 偏色检测 */ LgtDark float32 /* 亮暗检测 */ Clarity float32 /* 清晰度检测 */ Noise float32 /* 噪声检测 */ Contrast float32 /* 对比度检测 */ Occlusion float32 /* 遮挡检测 */ Blue float32 /* 蓝屏检测 */ Shark float32 /* 抖动检测 */ Freeze float32 /* 冻结检测 */ Mosaic float32 /* 马赛克检测 NEW: 新增深度学习版本 2.0.0*/ Flower float32 /* 花屏检测 NEW: 新增深度学习版本 2.0.0*/ Resverd1 int /* 保留,暂时不设置,默认 -999 */ Resverd2 int /* 保留,暂时不设置,默认 -999 */ Resverd3 int /* 保留,暂时不设置,默认 -999 */ }