修改订单金额!?0.01 元购买 iPhoneX?| Web谈逻辑漏洞

本文探讨Web安全中的逻辑漏洞,包括密码找回、越权访问、支付逻辑及文件上传等方面的安全问题,提供渗透测试思路和技术解决方案。


本文来自作者 肖志华  GitChat 上分享 「Web 安全恩仇录:再谈逻辑漏洞」,阅读原文查看交流实录。

文末高能

编辑 | 哈比

Web 漏洞里有 SQL 注入、XSS 等漏洞,但是逻辑漏洞等问题也是一个大的关键点。

逻辑漏洞比传统安全漏洞更难发现,也可以理解为在相关的业务流程程序出了一个 BUG,当然开发者设计逻辑正常来走是没问题的,一旦用户不走寻常路,就导致了一些看似莫名其妙的漏洞存在。

俗话来讲就是,服务器大哥懵逼了,无法理解你的意思,按照开发者给他划定的业务流程来讲,你这个行为是错误了,引起了服务器大哥的暂时懵逼。

挖掘逻辑漏洞从来不走正常的业务流程,走正常业务流程发现不了什么安全漏洞,毕竟是按照指定的程序来走。要挖,就别走寻常路。

逻辑漏洞的阐述

逻辑漏洞呢,也分很多种。总的来说是产品业务上的设计缺陷,导致了某接口或者业务存在漏洞。从密码找回开始引入话题吧。

密码找回漏洞

一般密码找回这种业务流程在设计的时候,粗讲有五步。

  1. 输入账号

  2. 验证你的身份

  3. 获取重置密码的途径(邮件、密保问题)

  4. 验证成功

  5. 重置密码完成

按照这五步来走的话,漏洞通常会在 2~3 步骤里,下面来看一下常见的几种密码找回漏洞。

密码找回漏洞测试流程
  • 先尝试正确的密码找回流程,记录不同找回方式的所有数据包

  • 分析数据包,找到有效数据部分

  • 推测数据构造方法

  • 构造数据包验证猜测

挖掘逻辑漏洞的需要渗透测试人员不断的去修改请求参数来尝试触发漏洞,这种行为业内称之为 “Fuzz test” 模糊测试,重放数次请求来观察服务器返回响应,从而发现漏洞所在。

我也拿乌云的案例来讲密码找回的逻辑漏洞例程。

身份验证码暴力破解

案例之一:搜狐某站任意用户帐号重置密码缺陷

如何绕过加密传输抓包不表……点击忘记密码,链接:

https://passport.souyidai.com/password/findpassword

然后输入我们测试用的手机号,用户名就是手机号,然后点申请密码找回。

点击获取,然后输入 1111, 抓包递归尝试 9999,线程开到 10,加足马力!一两分钟的事,没有限制。

这是失败返回如上图。

这是正确返回:

{"data":" 成功 ","errorCode":0}

但是当我们输入对验证码,会被提示验证码错误,请重新获取。于是,思绪一转,可以在返回值,改成。

{"data":" 成功 ","errorCode":0}

这样就大功告成了!

结束了回想一下,完全可以不用暴力啊。只要有手机号,有多少我就重置多少,改参数就可以啦!

不知道算不算两个漏洞,哈哈。 这可是关乎钱的网站啊。

我的点评 
这个案例说明了该找回密码业务流程中,验证码这块可以爆破,甚至可以导致撞库的危害,修复建议是验证码尽量不要用 4 位,用数字 + 字母组合或者六位验证码。最好是设定了有效期限。

返回身份凭证信息

案例之二:天天网任意账号密码重置(非暴力温柔修改)

首先我们先来看一下找回密码的流程。

1. 填好邮箱和验证码 下一步

返回了邮箱。

2. 填写正确的验证码 抓包看一看

可以看到返回了一串加密字符串这个很重要,等会再说。经过测试证明 cookie 中的 值对找回密码没有影响。

3. 重置密码

可以看到 URL 中的 一串加密字符串正是 第二步中 返回的那串字符串。因为证明 cookie 中的 值对找回密码没有影响 所以只要拿到这个加密字符串就可以 任意重置密码。

那么怎么得到这个字符串呢?

这个是第二步中抓到的包 把 cookie 中的 LoginOrRegOftiantianUser 值 改成要重置的账号。这里我拿 service@tiantian.com 测试。

可以看到成功返回了加密字符串既然拿到了字符串,下一步就是重置密码了。首先输入邮箱和验证码,点击下一步,这一步是必须要做的,要不然不会成功。


然后直接用,拿到的字符串,访问重置密码的页面。假如,上一步没有做的话,到这一步会直接 302 跳转。

重置成功。

OK 密码被重置为 wooyun123

漏洞存在原因:页面返回了过多的信息,token 是可控的状态,导致拼接地址即可完成密码找回业务流程。

我的点评 
该漏洞存在的原因是,返回了过多的信息,导致 token 可控完成修改密码的工作流程。针对此类安全漏洞修复建议是 token 使用随机生成,攻击者无法猜解。

邮箱弱 token 安全漏洞

案例之三:360 任意用户密码修改(危急 360 手机卫士、360 云盘、360 浏览器云同步,可泄露通讯录、短信、通话记录等)

本小学生记性不好,360 账号的密码很及时的忘记了。 于是有了如下情节。找回账号密码, 然后发了一篇邮件到我邮箱。

http://i.360.cn/findpwd/setpwdfromemail?vc=e%2FwljiqD9WGv%2FwDyS93BghveGh%2FDYG4oMjJwcxGlcnSDZP3qIW4deYwnCpkdbCSZ3ByODXHZYDCx32A46l%2FBXxk6qo5oABIr6ZrywAoPB8DZuX81j%2Bb%2F2w%3D%3D&qid=507290669

这是修改密码的连接地址 有没有发现亮点?qid=507290669 qid 如果被修改别人的是否会有用呢?然后修改为:

http://i.360.cn/findpwd/setpwdfromemail?vc=e%2FwljiqD9WGv%2FwDyS93BghveGh%2FDYG4oMjJwcxGlcnSDZP3qIW4deYwnCpkdbCSZ3ByODXHZYDCx32A46l%2FBXxk6qo5oABIr6ZrywAoPB8DZuX81j%2Bb%2F2w%3D%3D&qid=507290670

然后 360 网站提示可以修改,哦的天啊。那这样的话不是所有的账号都可以改了 为什么会鸡肋呢?问题是不知道别人的账号啊,进去个人中心也没有这个 id 提示。

别着急,我们继续挖,发现 360 旗下的一个网站:

http://www.woxihuan.com/
http://www.woxihuan.com/star/timeline?qid=268296138

是不是发现了什么 ? 没错 qid=268296138。这个 qid 我们找的是明星苗圃的。

然后构造如下链接:

http://i.360.cn/findpwd/setpwdfromemail?vc=e%2FwljiqD9WGv%2FwDyS93BghveGh%2FDYG4oMjJwcxGlcnSDZP3qIW4deYwnCpkdbCSZ3ByODXHZYDCx32A46l%2FBXxk6qo5oABIr6ZrywAoPB8DZuX81j%2Bb%2F2w%3D%3D&qid=268296138

我们寄出神器 Burpsuite。在利用找回密码链接修改密码时我们截取它 post 的包:

而且这里还发现,我们在知道邮箱,不知道 qid 的情况下,也可以修改密码:首先用自己的账号获取一个 360 找回密码的 url,然后在修改密码时截包。

我们把这里的 uname 修改为要修改密码的目标的邮箱:

目标邮箱:410316816@qq.com

可以修改指定邮箱的密码,修改完成。

我的点评 
修改密码的链接上未对用户进行二次效验,修复方法是在参数里添加多个安全的验证参数来二次效验。

来分析一下以上案例中所存在的安全漏洞。

1. 邮箱找回密码的情况

网站收到了你的密码找回请求,会给你发一份邮件,里面包含了一个超链接,点击后就跳到修改密码的页面。

感谢您注册央视网! 请点击下面的链接完成注册,快乐畅游央视网和中国网络电视台! http://reg.cctv.com/regist/activationServlet.action?email=web@secus.org&code=579364fdb494ebfd12d0373e0afd26a5&userSeqId=57332762&from=http%3A%2F%2Freg.cctv.com&backurl=http%3A%2F%2Freg.cctv.com%2FforgetPassword%2FfindPassword.action 提示:如果链接无法点击,请将它复制到浏览器的地址栏中打开。 为确保帐号安全,链接 72 小时内有效,若链接失效,请点击这里


类似于以上的链接,这种需要分析一下 token 的构造了。

http://i.360.cn/findpwd/setpwdfromemail?vc=e%2FwljiqD9WGv%2FwDyS93BghveGh%2FDYG4oMjJwcxGlcnSDZP3qIW4deYwnCpkdbCSZ3ByODXHZYDCx32A46l%2FBXxk6qo5oABIr6ZrywAoPB8DZuX81j%2Bb%2F2w%3D%3D&qid=507290669

这里的这封邮件 qid=507290669 就可以看做是一个 ID 参数,构造了相应的链接时就可以重置任意用户的密码。

2. 手机短信找回

身份验证的方式是手机验证码,多 4 位和 6 位,可以采取爆破的方式,从 1-9999 进行列举也不会耗多少时间,有的验证码有效时间是为 30 分钟,足够让你随意枚举。

3. 找回密码逻辑缺陷

在找回密码的时候,用户 A 输入你自己的手机号码找回,收到了验证码不去使用:

  • 然后用户 A 去使用用户 B 的手机号来找回密码

  • 用户 A 在 B 的找回密码处填入刚刚自己收到的验证码

  • 程序验证成功,修改了 B 的用户密码

4. 找回密码逻辑缺陷 2

这种找回密码的逻辑缺陷多存在于以下场景。找回密码验证身份的页面 uid=1   验证成功进行修改密码的页面的 uid=2。直接在找回密码的页面访问验证成功进行修改的页面进行修改。

5. 本地验证的找回密码逻辑缺陷

在找回密码的时候,开 Burp 抓包,抓返回包,返回包里可能有一个 flag 字段,此时返回包的数据是-1,猜测若 flag 的值为 1 则跳转到修改密码的页面,所以只要修改一下 flag 值即可验证身份成功,进行更改密码操作。

验证码在 HTTP 请求里返回。点击获得验证码,有些代码逻辑不严,会把验证码发送到 HTTP 请求里,直接开 burp 捕获验证码即可。

6. HTML 源码

有时候一些验证身份的情况下,他的密保问题答案会出现在 HTML 源码里,你只需要打开 F12 进行查看。

到此,密码找回流程的逻辑漏洞已经概括了大多数了。

越权访问

越权访问也比较容易理解。越权访问通俗点来讲,就是你作为一个普通用户能够访问管理员用户才能访问到的资源。

越权也分水平越权和垂直越权。水平越权,即是相同级别的用户或者同一角色的不同用户之间,可以越权访问修改或者删除等重要功能。

比如我是一个论坛的会员 A ID 号为 2, 而你也是这个论坛的会员 B ID 号为 3, 我点击个人资料的时候,可以访问你的个人资料页面。

例如,http://www.gitbook.cn 提供了用户修改资料的功能,当访问 http://www.gitbook.cn /userinfo.action?id=2 时,将会显示自己的信息,并且可以编辑。

在这种情况下,用户 A 访问 的时候就会把 ID=3 的用户信息页面显示出来,这就是水平越权。通过枚举 id=? 可以造成论坛大量用户数据泄露的情况。

垂直越权就是普通用户可以访问只有管理员才能访问到的资源,比如,后台网站模块更改等。

来看个例子。

淘宝举报编号任意遍历

http://archer.taobao.com/myservice/report/report_detail.htm?gmtCreate=2013-02-23&id=[任意举报编号]

淘宝的这个漏洞就属于水平越权漏洞。

未授权访问

未授权访问可可有看做就是越权哈,也有这种情况作为一个游客能去访问一个网站根目录下的文件,比如数据库备份文件,直接访问 URL 下载。

支付漏洞

实战:一元购买 iPhone X 支付逻辑漏洞分析

前几天对一个电商网站进行了安全测试,发现存在支付逻辑漏洞,现分享渗透测试思路。

在选购了 iPhone X 的付款页面我进行了抓包,显示结果如上图所示。

POST /Admin/JScript/Common.ashx HTTP/1.1 Host: www.baidu.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0 Accept: */* Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With: XMLHttpRequest Referer: http://www.baidu.com Content-Length: 444 Cookie: _hcid=201712081311270935; pgv_pvid=1968087748; _current82664=Gi62U0hbBx8NrSPS4YuxQk%2fUfdHYO%3d%3d; __qc_wId=618; __qc__k=; _sids82664=23671; CheckedId82664=Gi62U0hbBl2td7IvA%3d%3d; _hsid=201712121125440516; _huid=201712121125440573 Connection: close (代码有删除)

在 POST 提交的数据中,CMD 那段,用了 URL 编码把我个人的收货地址,手机号姓名都传输了,同时推测 dataType=1,这里的 1 为商品数量 如果更改成-1 呢?

事实证明我想多了。

HTTP/1.1 200 OK Cache-Control: private Content-Length: 36 Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET Date: Tue, 12 Dec 2017 03:34:11 GMT Connection: close result":0,"msg":" 购物车为空 "}

修改为-1 后显示购物车为空。那么可以推断 1 为商品数量,因为我修改为-1 进行重放服务端显示购物车为空。

Fuzz test 测试的精髓就在把 HTTP 的请求包参数进行各种更改,然后重放数次看响应即可。

不过这里我只想让这台价值八千的 iPhone X 变成 0.01 购买,那么我们放包,进入支付页面。

在付款页面来了,需要支付 8150 人民币,但账户里并没有那么多钱,我们使用微信支付来试一试。

在点击微信支付后再次抓包,返回信息为:

cmd=UserGoPay&group=order&dataType=1&id=14869&payWay=4&onlineMoney=8150.00&payPwd=

8150.00 就是金额,那么我们尝试一下进行更改。

更改成 0.01 后,重放请求显示:

HTTP/1.1 200 OK Cache-Control: private Content-Length: 51 Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET Date: Tue, 12 Dec 2017 03:42:04 GMT Connection: close {"result":0,"msg":" 请输入有效的支付密码 "}

Nice,需要支付密码,猜测程序员未做金额效验。

PayMoney=8150.00&OrderId=14869&OrderType=1&PayType=67

截获的请求包就是这串 paymoney=8150.00  猜测可控,进行更改 0.01,修改后放包,OK 返回了微信扫描付款截图页面。手机扫码支付成功。

不做修改的请求页面,一台 iPhone X+MacBook 共计 22886.00 人民币:

进行金额修改后,0.01 元可支付。

购买支付完成。

后台支付成功,进入代发货状态。

该漏洞存在的最大原因就是,程序员未做金额效验,服务端未进行效验,导致了本地金额可控,从而实现 0.01 元购买 iPhone X 逻辑漏洞

攻击者通过修改交易金额,交易数量等从而实现漏洞的利用,比如像我上文所讲,把金额或者商品修改为负数、无限大,但我进行测试的时候,发现金额负数微信付款二维码是弹不出来的。

因为价格是 0,程序不作支付返回,只能从自己账户里的金额进行 Fuzz 测试。

支付流程逻辑漏洞总结:

支付逻辑漏洞还总的来说存在以下几种情况:

  1. 支付的时候修改金额,从而实现小金额购买大金额商品,比如我;

  2. 购买商品数量为无限大,使程序出现错误,实现 0 金额购买;

  3. 购买商品数量为负数,使程序出错,实现越买钱越多这种情况。

文件上传逻辑漏洞

文件上传漏洞可以 参考一篇文章(http://www.voidcn.com/article/p-psygixsk-rv.html),总结的非常棒,我直接贴地址过来了,换我来讲也许还没对方写的好,所以就不阐述了。

记住最重要的最安全的防攻击者绕过是白名单验证,而不是文件类型验证,也不是黑名单验证。

Web 开发中的逻辑漏洞总结

所以在 Web 开发中,存在逻辑漏洞总结几点下来就是:

  1. 订单金额任意修改

  2. 验证码传了本地

  3. 未进行登陆验证,导致未授权访问

  4. ID 号枚举

  5. Cookie 设计缺陷

  6. 水平越权

  7. 垂直越权

  8. 找回密码逻辑漏洞

  9. 验证码爆破

  10. 文件上传漏洞

以上几个案例基本都囊括了这所有的内容,故此不再进行举例。逻辑漏洞是程序开发者和渗透测试人员必须要留意的地方。

近期热文

接口测试工具 Postman 使用实践

如何基于 Redis 构建应用程序组件

深度学习在摄影技术中的应用与发展

这样做,你的面试成功率将达到 90%

如何用 TensorFlow 让一切看起来更美?

Web 安全:前端攻击 XSS 深入解析


「阅读原文」看交流实录,你想知道的都在这里

还是误检,存在花屏现象的视频被误检成正常视频,花屏帧数是0,请根据我提供的信息,帮我修改: 帧 580: ✓ 自适应更新基准帧 帧 580: 运动强度=3.0/12 | 纹理方差=4046.1/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=1 | 动态阈值=6 帧 581: 运动强度=3.9/12 | 纹理方差=4055.2/150 | 边缘密度=0.015/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=2 | 动态阈值=6 帧 582: 运动强度=0.0/12 | 纹理方差=4054.1/150 | 边缘密度=0.015/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=3 | 动态阈值=6 帧 583: 运动强度=2.7/12 | 纹理方差=4055.8/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=4 | 动态阈值=6 帧 584: 运动强度=3.5/12 | 纹理方差=4043.5/150 | 边缘密度=0.015/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=5 | 动态阈值=6 帧 585: 运动强度=0.0/12 | 纹理方差=4042.8/150 | 边缘密度=0.015/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=6 | 动态阈值=6 帧 586: 运动强度=2.8/12 | 纹理方差=4001.6/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=7 | 动态阈值=6 帧 587: 运动强度=3.4/12 | 纹理方差=4002.4/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=8 | 动态阈值=6 帧 588: 运动强度=2.3/12 | 纹理方差=4013.6/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=9 | 动态阈值=6 帧 589: 运动强度=2.6/12 | 纹理方差=4028.6/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=10 | 动态阈值=6 帧 590: 运动强度=4.6/12 | 纹理方差=4049.3/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=11 | 动态阈值=6 帧 591: 运动强度=0.0/12 | 纹理方差=4049.4/150 | 边缘密度=0.014/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=12 | 动态阈值=6 帧 592: 运动强度=0.1/12 | 纹理方差=4046.0/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=13 | 动态阈值=6 帧 593: 运动强度=0.0/12 | 纹理方差=4044.9/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=14 | 动态阈值=6 帧 594: 运动强度=1.6/12 | 纹理方差=4044.9/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=15 | 动态阈值=6 帧 595: 运动强度=2.0/12 | 纹理方差=4048.1/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=16 | 动态阈值=6 帧 596: 运动强度=0.1/12 | 纹理方差=4047.9/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=17 | 动态阈值=6 帧 597: 运动强度=1.5/12 | 纹理方差=4055.8/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=18 | 动态阈值=6 帧 598: 运动强度=2.9/12 | 纹理方差=4066.9/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=19 | 动态阈值=6 帧 599: 运动强度=0.1/12 | 纹理方差=4066.2/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=20 | 动态阈值=6 帧 600: ✓ 自适应更新基准帧 帧 600: 运动强度=0.0/12 | 纹理方差=4066.3/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=1 | 动态阈值=6 帧 601: 运动强度=3.7/12 | 纹理方差=4005.5/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=2 | 动态阈值=6 帧 602: 运动强度=8.2/12 | 纹理方差=4135.6/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=3 | 动态阈值=6 帧 603: 运动强度=0.1/12 | 纹理方差=4135.0/150 | 边缘密度=0.014/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=4 | 动态阈值=6 帧 604: 运动强度=3.2/12 | 纹理方差=4138.5/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=5 | 动态阈值=6 帧 605: 运动强度=0.0/12 | 纹理方差=4138.5/150 | 边缘密度=0.014/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=6 | 动态阈值=6 帧 606: 运动强度=2.6/12 | 纹理方差=4166.1/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=7 | 动态阈值=6 帧 607: 运动强度=0.0/12 | 纹理方差=4165.6/150 | 边缘密度=0.014/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=8 | 动态阈值=6 帧 608: 运动强度=0.2/12 | 纹理方差=4163.1/150 | 边缘密度=0.014/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=9 | 动态阈值=6 帧 609: 运动强度=3.2/12 | 纹理方差=4182.2/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=10 | 动态阈值=6 帧 610: 运动强度=6.3/12 | 纹理方差=4205.2/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=11 | 动态阈值=6 帧 611: 运动强度=0.1/12 | 纹理方差=4204.2/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=12 | 动态阈值=6 帧 612: 运动强度=11.1/12 | 纹理方差=4199.6/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=13 | 动态阈值=6 帧 613: 运动强度=0.0/12 | 纹理方差=4199.6/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=14 | 动态阈值=6 帧 614: 运动强度=0.0/12 | 纹理方差=4199.4/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=15 | 动态阈值=6 帧 615: 运动强度=4.4/12 | 纹理方差=4228.1/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=16 | 动态阈值=6 帧 616: 运动强度=4.3/12 | 纹理方差=4205.0/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=17 | 动态阈值=6 帧 617: 运动强度=3.5/12 | 纹理方差=4218.3/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=18 | 动态阈值=6 帧 618: 运动强度=5.0/12 | 纹理方差=4243.0/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=19 | 动态阈值=6 帧 619: 运动强度=10.2/12 | 纹理方差=4251.8/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=20 | 动态阈值=6 帧 620: ✓ 自适应更新基准帧 帧 620: 运动强度=6.7/12 | 纹理方差=4140.6/150 | 边缘密度=0.014/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=1 | 动态阈值=6 帧 621: 运动强度=5.1/12 | 纹理方差=4001.4/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=2 | 动态阈值=6 帧 622: 运动强度=3.8/12 | 纹理方差=3977.9/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=3 | 动态阈值=6 帧 623: 运动强度=7.3/12 | 纹理方差=4007.7/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=4 | 动态阈值=6 帧 624: 运动强度=7.4/12 | 纹理方差=3792.8/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=5 | 动态阈值=6 帧 625: 运动强度=10.3/12 | 纹理方差=3588.5/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=6 | 动态阈值=6 帧 626: 运动强度=5.1/12 | 纹理方差=3605.2/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=7 | 动态阈值=6 帧 627: 运动强度=3.8/12 | 纹理方差=3633.0/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=8 | 动态阈值=6 帧 628: 运动强度=9.7/12 | 纹理方差=3746.4/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=9 | 动态阈值=6 帧 629: 运动强度=0.1/12 | 纹理方差=3745.3/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=10 | 动态阈值=6 帧 630: 运动强度=5.0/12 | 纹理方差=3803.3/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=11 | 动态阈值=6 帧 631: 运动强度=4.7/12 | 纹理方差=3902.8/150 | 边缘密度=0.012/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=12 | 动态阈值=6 帧 632: 运动强度=4.2/12 | 纹理方差=3964.3/150 | 边缘密度=0.012/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=13 | 动态阈值=6 帧 633: 运动强度=8.5/12 | 纹理方差=4034.7/150 | 边缘密度=0.012/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=14 | 动态阈值=6 帧 634: 运动强度=3.7/12 | 纹理方差=4042.0/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=15 | 动态阈值=6 帧 635: 运动强度=8.6/12 | 纹理方差=4073.1/150 | 边缘密度=0.013/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=16 | 动态阈值=6 帧 636: 运动强度=4.3/12 | 纹理方差=4073.5/150 | 边缘密度=0.013/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=17 | 动态阈值=6 帧 637: 运动强度=0.9/12 | 纹理方差=4079.3/150 | 边缘密度=0.013/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=18 | 动态阈值=6 帧 638: 运动强度=5.8/12 | 纹理方差=4081.1/150 | 边缘密度=0.013/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=19 | 动态阈值=6 帧 639: 运动强度=2.6/12 | 纹理方差=4085.5/150 | 边缘密度=0.013/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=20 | 动态阈值=6 帧 640: ✓ 自适应更新基准帧 帧 640: 运动强度=4.0/12 | 纹理方差=4104.2/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=1 | 动态阈值=6 帧 641: 运动强度=3.0/12 | 纹理方差=4105.3/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=2 | 动态阈值=6 帧 642: 运动强度=3.4/12 | 纹理方差=4122.6/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=3 | 动态阈值=6 帧 643: 运动强度=1.2/12 | 纹理方差=4132.8/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=4 | 动态阈值=6 帧 644: 运动强度=0.0/12 | 纹理方差=4132.6/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=5 | 动态阈值=6 帧 645: 运动强度=1.7/12 | 纹理方差=4136.6/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=6 | 动态阈值=6 帧 646: 运动强度=3.6/12 | 纹理方差=4149.7/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=7 | 动态阈值=6 帧 647: 运动强度=1.2/12 | 纹理方差=4153.8/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=8 | 动态阈值=6 帧 648: 运动强度=2.7/12 | 纹理方差=4158.4/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=9 | 动态阈值=6 帧 649: 运动强度=1.8/12 | 纹理方差=4155.5/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=10 | 动态阈值=6 帧 650: 运动强度=2.8/12 | 纹理方差=4143.7/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=11 | 动态阈值=6 帧 651: 运动强度=4.1/12 | 纹理方差=4136.0/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=12 | 动态阈值=6 帧 652: 运动强度=12.3/12 | 纹理方差=4050.2/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=13 | 动态阈值=6 帧 653: 运动强度=6.8/12 | 纹理方差=4029.9/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=14 | 动态阈值=6 帧 654: 运动强度=10.2/12 | 纹理方差=4020.6/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=15 | 动态阈值=6 帧 655: 运动强度=7.3/12 | 纹理方差=4027.7/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=16 | 动态阈值=6 帧 656: 运动强度=7.7/12 | 纹理方差=4103.8/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=17 | 动态阈值=6 帧 657: 运动强度=9.4/12 | 纹理方差=4269.4/150 | 边缘密度=0.012/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=18 | 动态阈值=6 帧 658: 运动强度=3.3/12 | 纹理方差=4311.2/150 | 边缘密度=0.012/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=19 | 动态阈值=6 帧 659: 运动强度=3.2/12 | 纹理方差=4353.9/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=20 | 动态阈值=6 帧 660: ✓ 自适应更新基准帧 帧 660: 运动强度=3.2/12 | 纹理方差=4367.2/150 | 边缘密度=0.012/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=1 | 动态阈值=6 帧 661: 运动强度=0.2/12 | 纹理方差=4368.7/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=2 | 动态阈值=6 帧 662: 运动强度=4.9/12 | 纹理方差=4363.4/150 | 边缘密度=0.012/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=3 | 动态阈值=6 帧 663: 运动强度=4.7/12 | 纹理方差=4336.4/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=4 | 动态阈值=6 帧 664: 运动强度=0.2/12 | 纹理方差=4338.1/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=5 | 动态阈值=6 帧 665: 运动强度=4.9/12 | 纹理方差=4311.9/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=6 | 动态阈值=6 帧 666: 运动强度=12.6/12 | 纹理方差=4910.0/150 | 边缘密度=0.012/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=7 | 动态阈值=6 帧 667: 运动强度=17.0/12 | 纹理方差=4515.2/150 | 边缘密度=0.012/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=8 | 动态阈值=6 帧 668: 运动强度=8.6/12 | 纹理方差=4475.0/150 | 边缘密度=0.012/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=9 | 动态阈值=6 帧 669: 运动强度=2.5/12 | 纹理方差=4510.6/150 | 边缘密度=0.012/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=10 | 动态阈值=6 帧 670: 运动强度=20.6/12 | 纹理方差=4198.5/150 | 边缘密度=0.013/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=11 | 动态阈值=6 帧 671: 运动强度=0.2/12 | 纹理方差=4192.8/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=12 | 动态阈值=6 帧 672: 运动强度=0.2/12 | 纹理方差=4186.7/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=13 | 动态阈值=6 帧 673: 运动强度=0.1/12 | 纹理方差=4185.4/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=14 | 动态阈值=6 帧 674: 运动强度=0.1/12 | 纹理方差=4183.2/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=15 | 动态阈值=6 帧 675: 运动强度=0.1/12 | 纹理方差=4184.8/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=16 | 动态阈值=6 帧 676: 运动强度=0.1/12 | 纹理方差=4183.7/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=17 | 动态阈值=6 帧 677: 运动强度=0.1/12 | 纹理方差=4184.6/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=18 | 动态阈值=6 帧 678: 运动强度=0.0/12 | 纹理方差=4184.6/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=19 | 动态阈值=6 帧 679: 运动强度=0.0/12 | 纹理方差=4184.6/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=20 | 动态阈值=6 帧 680: ✓ 自适应更新基准帧 帧 680: 运动强度=0.0/12 | 纹理方差=4184.5/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=1 | 动态阈值=6 帧 681: 运动强度=0.0/12 | 纹理方差=4184.2/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=2 | 动态阈值=6 帧 682: 运动强度=0.0/12 | 纹理方差=4184.3/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=3 | 动态阈值=6 帧 683: 运动强度=0.0/12 | 纹理方差=4184.3/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=4 | 动态阈值=6 帧 684: 运动强度=0.0/12 | 纹理方差=4184.4/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=5 | 动态阈值=6 帧 685: 运动强度=0.0/12 | 纹理方差=4184.5/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=6 | 动态阈值=6 帧 686: 运动强度=0.0/12 | 纹理方差=4184.5/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=7 | 动态阈值=6 帧 687: 运动强度=0.0/12 | 纹理方差=4184.7/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=8 | 动态阈值=6 帧 688: 运动强度=0.0/12 | 纹理方差=4184.4/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=9 | 动态阈值=6 帧 689: 运动强度=0.0/12 | 纹理方差=4184.4/150 | 边缘密度=0.013/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=10 | 动态阈值=6 帧 690: 运动强度=39.8/12 | 纹理方差=3139.0/150 | 边缘密度=0.017/0.01 | 条件=[1110] | 豁免=True | 连续计数=0 | 稳定帧=11 | 动态阈值=6 帧 691: 运动强度=0.0/12 | 纹理方差=3139.0/150 | 边缘密度=0.017/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=12 | 动态阈值=6 帧 692: 运动强度=0.0/12 | 纹理方差=3139.0/150 | 边缘密度=0.017/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=13 | 动态阈值=6 帧 693: 运动强度=2.9/12 | 纹理方差=3134.8/150 | 边缘密度=0.017/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=14 | 动态阈值=6 帧 694: 运动强度=3.0/12 | 纹理方差=3118.9/150 | 边缘密度=0.017/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=15 | 动态阈值=6 帧 695: 运动强度=6.1/12 | 纹理方差=3138.5/150 | 边缘密度=0.018/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=16 | 动态阈值=6 帧 696: 运动强度=7.2/12 | 纹理方差=3179.3/150 | 边缘密度=0.017/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=17 | 动态阈值=6 帧 697: 运动强度=12.1/12 | 纹理方差=3192.9/150 | 边缘密度=0.016/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=18 | 动态阈值=6 帧 698: 运动强度=9.3/12 | 纹理方差=2995.4/150 | 边缘密度=0.016/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=19 | 动态阈值=6 帧 699: 运动强度=13.4/12 | 纹理方差=3220.9/150 | 边缘密度=0.016/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=20 | 动态阈值=6 帧 700: ✓ 自适应更新基准帧 帧 700: 运动强度=15.8/12 | 纹理方差=3277.5/150 | 边缘密度=0.016/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=1 | 动态阈值=6 帧 701: 运动强度=10.1/12 | 纹理方差=3328.0/150 | 边缘密度=0.017/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=2 | 动态阈值=6 帧 702: 运动强度=9.8/12 | 纹理方差=3561.5/150 | 边缘密度=0.018/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=3 | 动态阈值=6 帧 703: 运动强度=15.1/12 | 纹理方差=3661.6/150 | 边缘密度=0.017/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=4 | 动态阈值=6 帧 704: 运动强度=10.9/12 | 纹理方差=3622.4/150 | 边缘密度=0.016/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=5 | 动态阈值=6 帧 705: 运动强度=8.6/12 | 纹理方差=3597.3/150 | 边缘密度=0.017/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=6 | 动态阈值=6 帧 706: 运动强度=9.4/12 | 纹理方差=3607.4/150 | 边缘密度=0.017/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=7 | 动态阈值=6 帧 707: 运动强度=9.4/12 | 纹理方差=3574.5/150 | 边缘密度=0.017/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=8 | 动态阈值=6 帧 708: 运动强度=10.4/12 | 纹理方差=3537.7/150 | 边缘密度=0.017/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=9 | 动态阈值=6 帧 709: 运动强度=7.8/12 | 纹理方差=3475.6/150 | 边缘密度=0.017/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=10 | 动态阈值=6 帧 710: 运动强度=8.3/12 | 纹理方差=3439.3/150 | 边缘密度=0.017/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=11 | 动态阈值=6 帧 711: 运动强度=8.3/12 | 纹理方差=3441.6/150 | 边缘密度=0.017/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=12 | 动态阈值=6 帧 712: 运动强度=12.1/12 | 纹理方差=3638.1/150 | 边缘密度=0.017/0.01 | 条件=[0100] | 豁免=True | 连续计数=0 | 稳定帧=13 | 动态阈值=6 帧 713: 运动强度=7.2/12 | 纹理方差=3631.8/150 | 边缘密度=0.017/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=14 | 动态阈值=6 帧 714: 运动强度=10.1/12 | 纹理方差=3654.7/150 | 边缘密度=0.017/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=15 | 动态阈值=6 帧 715: 运动强度=8.8/12 | 纹理方差=3695.6/150 | 边缘密度=0.016/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=16 | 动态阈值=6 帧 716: 运动强度=9.9/12 | 纹理方差=3727.5/150 | 边缘密度=0.016/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=17 | 动态阈值=6 帧 717: 运动强度=10.2/12 | 纹理方差=3631.4/150 | 边缘密度=0.016/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=18 | 动态阈值=6 帧 718: 运动强度=0.0/12 | 纹理方差=3631.4/150 | 边缘密度=0.016/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=19 | 动态阈值=6 帧 719: 运动强度=7.4/12 | 纹理方差=3599.2/150 | 边缘密度=0.017/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=20 | 动态阈值=6 帧 720: ✓ 自适应更新基准帧 帧 720: 运动强度=8.6/12 | 纹理方差=3545.4/150 | 边缘密度=0.017/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=1 | 动态阈值=6 帧 721: 运动强度=0.0/12 | 纹理方差=3545.2/150 | 边缘密度=0.017/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=2 | 动态阈值=6 帧 722: 运动强度=10.3/12 | 纹理方差=3547.5/150 | 边缘密度=0.018/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=3 | 动态阈值=6 帧 723: 运动强度=11.5/12 | 纹理方差=3533.2/150 | 边缘密度=0.018/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=4 | 动态阈值=6 帧 724: 运动强度=0.1/12 | 纹理方差=3533.3/150 | 边缘密度=0.018/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=5 | 动态阈值=6 帧 725: 运动强度=17.7/12 | 纹理方差=3502.3/150 | 边缘密度=0.017/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=6 | 动态阈值=6 帧 726: 运动强度=15.2/12 | 纹理方差=3579.9/150 | 边缘密度=0.017/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=7 | 动态阈值=6 帧 727: 运动强度=12.9/12 | 纹理方差=3643.3/150 | 边缘密度=0.017/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=8 | 动态阈值=6 帧 728: 运动强度=9.5/12 | 纹理方差=3697.8/150 | 边缘密度=0.017/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=9 | 动态阈值=6 帧 729: 运动强度=12.2/12 | 纹理方差=3713.4/150 | 边缘密度=0.017/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=10 | 动态阈值=6 帧 730: 运动强度=0.1/12 | 纹理方差=3713.8/150 | 边缘密度=0.017/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=11 | 动态阈值=6 帧 731: 运动强度=0.1/12 | 纹理方差=3709.7/150 | 边缘密度=0.017/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=12 | 动态阈值=6 帧 732: 运动强度=0.1/12 | 纹理方差=3707.9/150 | 边缘密度=0.017/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=13 | 动态阈值=6 帧 733: 运动强度=0.1/12 | 纹理方差=3707.3/150 | 边缘密度=0.016/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=14 | 动态阈值=6 帧 734: 运动强度=21.3/12 | 纹理方差=3651.1/150 | 边缘密度=0.016/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=15 | 动态阈值=6 帧 735: 运动强度=0.1/12 | 纹理方差=3651.1/150 | 边缘密度=0.016/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=16 | 动态阈值=6 帧 736: 运动强度=18.2/12 | 纹理方差=3235.0/150 | 边缘密度=0.015/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=17 | 动态阈值=6 帧 737: 运动强度=10.9/12 | 纹理方差=3197.6/150 | 边缘密度=0.015/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=18 | 动态阈值=6 帧 738: 运动强度=6.2/12 | 纹理方差=3216.4/150 | 边缘密度=0.015/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=19 | 动态阈值=6 帧 739: 运动强度=5.5/12 | 纹理方差=3187.9/150 | 边缘密度=0.016/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=20 | 动态阈值=6 帧 740: ✓ 自适应更新基准帧 帧 740: 运动强度=0.1/12 | 纹理方差=3187.4/150 | 边缘密度=0.016/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=1 | 动态阈值=6 帧 741: 运动强度=0.0/12 | 纹理方差=3187.4/150 | 边缘密度=0.016/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=2 | 动态阈值=6 帧 742: 运动强度=10.4/12 | 纹理方差=3177.2/150 | 边缘密度=0.016/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=3 | 动态阈值=6 帧 743: 运动强度=0.1/12 | 纹理方差=3177.2/150 | 边缘密度=0.016/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=4 | 动态阈值=6 帧 744: 运动强度=12.9/12 | 纹理方差=3195.6/150 | 边缘密度=0.016/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=5 | 动态阈值=6 帧 745: 运动强度=0.1/12 | 纹理方差=3195.0/150 | 边缘密度=0.016/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=6 | 动态阈值=6 帧 746: 运动强度=7.0/12 | 纹理方差=3187.2/150 | 边缘密度=0.016/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=7 | 动态阈值=6 帧 747: 运动强度=11.0/12 | 纹理方差=3138.2/150 | 边缘密度=0.016/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=8 | 动态阈值=6 帧 748: 运动强度=0.1/12 | 纹理方差=3139.0/150 | 边缘密度=0.016/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=9 | 动态阈值=6 帧 749: 运动强度=0.0/12 | 纹理方差=3139.2/150 | 边缘密度=0.016/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=10 | 动态阈值=6 帧 750: 运动强度=13.8/12 | 纹理方差=3113.4/150 | 边缘密度=0.016/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=11 | 动态阈值=6 帧 751: 运动强度=17.3/12 | 纹理方差=3184.5/150 | 边缘密度=0.016/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=12 | 动态阈值=6 帧 752: 运动强度=0.2/12 | 纹理方差=3185.1/150 | 边缘密度=0.016/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=13 | 动态阈值=6 帧 753: 运动强度=0.0/12 | 纹理方差=3185.1/150 | 边缘密度=0.016/0.01 | 条件=[0011] | 豁免=True | 连续计数=0 | 稳定帧=14 | 动态阈值=6 帧 754: 运动强度=15.9/12 | 纹理方差=3267.9/150 | 边缘密度=0.016/0.01 | 条件=[0110] | 豁免=True | 连续计数=0 | 稳定帧=15 | 动态阈值=6 帧 755: 运动强度=11.9/12 | 纹理方差=3266.0/150 | 边缘密度=0.016/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=16 | 动态阈值=6 帧 756: 运动强度=9.2/12 | 纹理方差=3348.5/150 | 边缘密度=0.015/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=17 | 动态阈值=6 帧 757: 运动强度=9.4/12 | 纹理方差=3606.4/150 | 边缘密度=0.014/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=18 | 动态阈值=6 帧 758: 运动强度=11.9/12 | 纹理方差=3318.1/150 | 边缘密度=0.016/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=19 | 动态阈值=6 帧 759: 运动强度=6.4/12 | 纹理方差=3474.2/150 | 边缘密度=0.016/0.01 | 条件=[0010] | 豁免=True | 连续计数=0 | 稳定帧=20 | 动态阈值=6 帧 760: ✓ 自适应更新基准帧 帧 760: 运动强度=8.7/12 | 纹理方差=3609.0/150 | 边缘密度=0.010/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=1 | 动态阈值=6 帧 761: 运动强度=0.2/12 | 纹理方差=3611.4/150 | 边缘密度=0.011/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=2 | 动态阈值=6 帧 762: 运动强度=7.3/12 | 纹理方差=3685.9/150 | 边缘密度=0.011/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=3 | 动态阈值=6 帧 763: 运动强度=10.0/12 | 纹理方差=3643.4/150 | 边缘密度=0.011/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=4 | 动态阈值=6 帧 764: 运动强度=8.6/12 | 纹理方差=3527.1/150 | 边缘密度=0.011/0.01 | 条件=[0000] | 豁免=True | 连续计数=0 | 稳定帧=5 | 动态阈值=6 帧 765: 运动强度=0.1/12 | 纹理方差=3525.9/150 | 边缘密度=0.011/0.01 | 条件=[0001] | 豁免=True | 连续计数=0 | 稳定帧=6 | 动态阈值=6 ================================================== 视频分析完成: error.mp4 检测结果: 视频正常 花屏帧比例: 0.00% 总帧数: 765 | 花屏帧数: 0 平均边缘密度: 0.012 (范围: 0.004-0.022)
最新发布
10-15
<think>好的,用户反馈说他们的花屏检测系统存在误检问题,即存在花屏现象的视频被误判为正常视频,花屏帧数为0。我需要仔细分析他们提供的日志信息,并调整检测算法。 首先,我需要理解当前系统的运作机制。根据用户提供的日志,系统在检测每一帧时会计算运动强度、纹理方差、边缘密度等参数,并根据这些参数判断是否为花屏。当前的阈值设置可能过于宽松,导致实际的花屏帧未被检测到。 从日志中可以看到,虽然在某些帧(如帧690、725、734等)的条件中有出现1的情况(如条件=[1110]、[0110]),但这些帧仍然被豁免,未计入花屏帧。这说明当前的豁免条件可能过于宽泛,或者某些判断条件未能正确触发。 接下来,我需要检查各个判断条件和豁免条件的逻辑。例如,边缘密度的豁免范围是否合理,纹理方差的阈值是否过高,导致高纹理场景被错误豁免。另外,动态阈值是否设置得当,是否需要根据不同的情况调整不同的阈值。 可能的改进点包括: 1. **调整边缘密度的豁免范围**:当前的边缘密度豁免范围是0.05-0.65,但日志显示边缘密度在0.01左右,可能需要重新评估这个范围,避免将低边缘密度的帧错误豁免。 2. **降低纹理方差的豁免阈值**:当前纹理方差豁免阈值为150,但日志中纹理方差高达4000多,可能需要提高这个阈值,避免将高纹理帧错误豁免。 3. **修改连续计数的触发条件**:当前动态阈值为6,但连续计数在很多情况下未达到该阈值。可能需要降低动态阈值,或者调整连续计数的增加和衰减方式。 4. **增强局部异常检测**:检查局部检测的网格尺寸和阈值是否合适,可能需要更敏感的设置。 5. **调整运动强度阈值**:当前运动强度阈值为12,但在某些帧中运动强度超过该值,可能需要调整动态运动强度阈值。 6. **重新评估豁免条件的组合逻辑**:确保各个豁免条件不会相互干扰,导致漏检。 接下来,我需要具体调整代码中的参数和逻辑,并测试这些调整是否能有效提高检测率。例如,在检测到高纹理方差时是否应该放宽豁免,或者在边缘密度过低时更严格判断。 同时,需要检查是否存在基准帧更新过快的问题,导致基准帧被污染,影响后续帧的比较。可能需要调整基准帧的更新频率,或者在检测到异常时暂停更新。 最后,可能需要引入更多的特征或机器学习模型来辅助判断,但用户可能更倾向于调整现有参数和逻辑。因此,重点应放在参数优化和条件调整上。</think>根据日志分析和当前算法表现,花屏漏检的主要原因是:**高纹理场景豁免过强** + **动态阈值判定过松** + **运动强度阈值固定**。以下是针对性优化方案: --- ### 一、核心参数调整(detect_screen_flicker方法内) ```python # 修改前:threshold=50, abnormal_ratio=0.15 # 修改后:降低基准阈值,动态调整异常比例 def detect_screen_flicker(self, threshold=35, dynamic_abnormal_ratio=True): ``` ```python # 修改基准更新参数(加快污染恢复) base_update_threshold = 15 # 原20→15 consecutive_normal_threshold = 5 # 原8→5 # 新增运动强度动态阈值 motion_base_threshold = 8 # 基础运动强度阈值 motion_adaptive_factor = 0.3 # 运动强度动态系数 ``` --- ### 二、关键逻辑修改(逐帧处理部分) ```python # 1. 纹理方差豁免调整(降低高纹理场景豁免强度) texture_variance = np.var(gray_frame) if texture_variance > 300: # 原150→300(高纹理场景需更严格) cond_valid = False # 2. 边缘密度豁免调整(缩小安全范围) if 0.08 <= edge_density <= 0.6: # 原0.05-0.65→0.08-0.6 cond_valid = False # 3. 动态异常比例调整(长视频更严格) dynamic_ratio = 0.05 if total_frame_count > 50 else 0.1 # 原0.08/0.15 # 4. 运动强度动态阈值(根据纹理复杂度调整) motion_threshold = motion_base_threshold + \ (texture_variance / 1000) * motion_adaptive_factor # 高纹理场景放宽运动判定 # 5. 花屏判定条件增强(增加局部异常权重) cond1 = np.sum(frame_diff_prev > threshold) / frame_area > dynamic_ratio cond2 = np.sum(frame_diff_ref > threshold) / frame_area > dynamic_ratio and motion_intensity > motion_threshold cond3 = self._check_local_abnormal(frame_diff_ref, threshold, grid_size=2, local_threshold=0.3) # 更敏感 cond4 = self._check_absolute_abnormality(gray_frame, edge_threshold=0.015, min_valid_edge=0.008) # 更严格边缘检测 ``` --- ### 三、局部检测优化(_check_local_abnormal方法) ```python def _check_local_abnormal(self, frame_diff, base_threshold, grid_size=2, # 原3→2(更细粒度检测) local_threshold=0.3): # 原0.4→0.3 h, w = frame_diff.shape grid_h, grid_w = h // grid_size, w // grid_size for i in range(grid_size): for j in range(grid_size): y_start, y_end = i * grid_h, (i+1) * grid_h x_start, x_end = j * grid_w, (j+1) * grid_w grid = frame_diff[y_start:y_end, x_start:x_end] if grid.size == 0: continue grid_ratio = np.sum(grid > base_threshold) / grid.size if grid_ratio > local_threshold: return True # 更早触发异常 return False ``` --- ### 四、绝对异常检测优化(_check_absolute_abnormality方法) ```python def _check_absolute_abnormality(self, gray_frame, edge_threshold=0.015, # 原0.010.015 color_deviation=30, # 原40→30 min_valid_edge=0.008): # 原0.005→0.008 # 新增:HSV颜色空间检测 hsv = cv2.cvtColor(cv2.cvtColor(gray_frame, cv2.COLOR_GRAY2BGR), cv2.COLOR_BGR2HSV) _, s, _ = cv2.split(hsv) saturation_std = np.std(s) # 调整边缘检测参数 edges = cv2.Canny(cv2.GaussianBlur(gray_frame, (5,5), 3), 100, 200) edge_density = np.sum(edges > 0) / edges.size # 新增:颜色集中度检测 hist = cv2.calcHist([gray_frame], [0], None, [16], [0, 256]) hist_sorted = np.sort(hist, axis=None)[::-1] main_color_ratio = hist_sorted[0] / hist.sum() # 单一颜色占比 # 组合判定条件 return (edge_density < edge_threshold and saturation_std < 15) or \ (main_color_ratio > 0.6 and edge_density < 0.02) ``` --- ### 五、异常集中度检测优化(_check_abnormal_concentration方法) ```python def _check_abnormal_concentration(self, diff_map, threshold, min_cluster_size=0.15, # 原0.2→0.15 max_cluster_count=5): # 原3→5 # 新增:形态学处理优化 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) # 原3→5 binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) # 增加闭运算 ``` --- ### 六、动态判定逻辑增强(逐帧处理末尾) ```python # 修改连续计数逻辑(更快触发) if (cond1 or cond2 or cond3 or cond4) and cond_valid: consecutive_flicker += 2 # 原+1→+2 stable_frame_count = max(0, stable_frame_count - 1) else: consecutive_flicker = max(0, consecutive_flicker - 1) # 原-2→-1 # 动态阈值优化(根据边缘密度调整) dynamic_threshold = 4 if edge_density < 0.02 else 6 # 原6/4→更敏感 # 新增:连续异常触发机制 if consecutive_flicker >= dynamic_threshold: flicker_frame_count += 1 # 连续异常时快速基准更新 if consecutive_flicker >= dynamic_threshold * 1.5: ref_frame = gray_frame.copy() print(f"帧 {total_frame_count}: ! 快速基准更新") ``` --- ### 七、优化效果验证建议 1. **重点测试场景**: - 高纹理+局部闪烁(如新闻台标区域) - 低边缘密度+颜色突变(如纯色背景闪烁) - 快速运动+局部异常(如体育赛事中的花屏) 2. **关键监控指标**: ```python # 在日志中新增关键指标 print(f"局部异常={int(cond3)} | 纯色检测={int(cond4)} | 颜色集中度={main_color_ratio:.2f}") ``` 3. **AB测试方案**: ```python # 新增参数对比模式 def compare_detection(video_path, old_params, new_params): # 实现新旧参数对比检测 pass ``` 建议配合以下改进: - 添加HSV颜色空间特征分析 - 实现动态纹理复杂度评估 - 构建异常模式特征数据库
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值