水动力分析 · 光流法读水面

看懂水流,才知道鱼在哪。

拍一段 10 秒的水面视频,算法用密集光流算出每一个像素的流向与流速, 从中找出剪切线、反流和漩涡,再融合成一份「这一竿该打哪里」的优先级排序。
下面是一段真实素材的分析结果 —— 每一个数字与坐标都来自算法实际输出,没有一个是编的。

水体占比75.7%画面中被判为流动水面的比例
主流方向由右向左,略偏向远处河岸-177.2°(画面坐标系,0° 向右、90° 向下)
检出特征17个剪切线 5 处、反流 12 处、漩涡 0 处
推荐区域3处按综合评分排序,最高 46.9 分

分析结果图

素材 17270678.mp4 · 1280x720 · 10.5s
待分析的水面实拍底帧(固定机位拍摄的河道水面)水流剪切线(S)置信度 1.00|网格 3,24S水流剪切线(S)置信度 1.00|网格 4,20S水流剪切线(S)置信度 0.85|网格 3,2S水流剪切线(S)置信度 0.82|网格 11,24S水流剪切线(S)置信度 0.55|网格 8,20S反流区(B)置信度 0.75|网格 3,3B反流区(B)置信度 0.53|网格 7,18B反流区(B)置信度 0.47|网格 6,20B反流区(B)置信度 0.47|网格 6,22B反流区(B)置信度 0.45|网格 1,25B反流区(B)置信度 0.42|网格 1,11B反流区(B)置信度 0.42|网格 1,12B反流区(B)置信度 0.42|网格 3,25B反流区(B)置信度 0.42|网格 8,20B反流区(B)置信度 0.42|网格 9,21B反流区(B)置信度 0.42|网格 9,22B反流区(B)置信度 0.40|网格 1,14B推荐区域 1:46.9 分 · 普通区域147推荐区域 2:40.0 分 · 普通区域240推荐区域 3:40.0 分 · 普通区域340
底帧为素材视频中间帧;叠加层由算法输出的归一化坐标重绘(箭头 181 条、特征点 17 个、推荐区域 3 个)。
水流剪切线5反流区12漩涡0流场方向(长度/深浅 = 相对流速)

算法说明 · 一

从一段视频到一份钓点排序
要经过六步

整条管线由上游小程序的水动力分析算法实现。这里写的是它真实执行的过程, 括号里的数字都是代码里的实际配置值。

  1. 均匀取帧固定机位拍的水面视频按目标 4 帧/秒抽样,取 30~60 帧(本次素材 41 帧,3.9 帧/秒),转灰度后进入分析。
  2. 光照归一CLAHE 自适应直方图均衡(clipLimit 2.0、8×8 分块)压掉水面高光与阴影的亮度差 —— 否则同一片水会因为反光强弱算出完全不同的流速。
  3. 密集光流用 Farneback 稠密光流求出每个像素在相邻两帧间的运动矢量(金字塔 0.5×、3 层、窗口 15、多项式 5 阶)。为提速先在 0.5 倍降采样图上计算,还原到原分辨率时同步把矢量幅值补偿回来,否则所有流速都会被系统性低估。
  4. 抖动抑制与透视补偿远景在画面上被透视压扁,位移天然偏小:算法按画面高度把上半部分流速最多放大 2.5× 做补偿,让远近水面可比。同时实现了基于画面边缘静态参照(上边条 20% + 左右边条 10% 取中值)的相机运动补偿;当前生产配置下该补偿关闭,改用「拍摄稳定性检测」——先判断视频适不适合分析,不适合就提示重拍,比事后补偿更可靠。
  5. 双掩膜分离水面先用亮度超过 248 且持续超过 25% 帧的像素标出「反光不可靠区」;再用流速超过 3 px/s 的判据取出水体,依次做闭运算(填洞)→ 开运算(去噪)→ 腐蚀(削掉岸边薄层),确保后续检测只在真正流动的水面上进行。
  6. 分格聚合与特征检出把水面切成 48px 的方格,逐格统计平均流速、流向与旋度,再跑漩涡 / 反流 / 剪切线三类检测器,最后按权重融合出钓点优先级 —— 也就是下面展示的结果。

算法说明 · 二

它到底在找什么
三类水动力结构

掠食性鱼类不会均匀分布在水面上。它们沿着能量最省、饵料最集中的位置排布, 而这些位置在水流上是有特征的 —— 算法找的就是这三类特征。

水流剪切线

两股流速或流向不同的水流的交界面:一侧快、一侧慢。

掠食鱼不会待在急流里,而是贴在剪切线的缓流一侧伏击被冲晕的饵鱼 —— 这是水动力特征里价值最高的一类,权重给到 40。

反流区

相对周围水流方向几乎相反(夹角 > 110°)的局部回流。

反流区水流压力低、饵料被反复搅进来,是鱼的节能停留点,尤其适合作为抛投落点。

漩涡

中心是平静的「眼」、周围一圈持续旋转的水流结构。

漩涡持续做水流交换、把饵料卷在原地,形成天然的觅食区;作钓要打外缘,别打湍流核心。

检测阈值(上游配置值)
  • 剪切线流速梯度 ≥ 0.45 且方向梯度 ≥ 0.6 /像素
  • 反流与周围 3×3 邻域平均流向夹角 ≥ 110°,持续 ≥ 1.5s、流速 ≥ 2 px/s
  • 漩涡邻域旋度 ≥ 0.2,且中心流速 ≤ 0.7× 周围(平静的「眼」)
  • 通用过滤距岸 ≥ 150px、所在格子水体占比 ≥ 0.35、按类型限量(剪切线 5 / 反流 12 / 漩涡 5)

算法说明 · 三

三类特征怎么变成
一个分数

每个方格先按「权重 × 置信度」累加,再对同时出现多种特征的格子加组合分, 最后封顶 100。权重之和正好是 100,所以原始分可以直接当百分制看。

特征权重说明
水流剪切线40两股流速或流向不同的水流的交界面:一侧快、一侧慢。
反流区35相对周围水流方向几乎相反(夹角 > 110°)的局部回流。
漩涡25中心是平静的「眼」、周围一圈持续旋转的水流结构。
合计100(因此原始分即百分制)

注:泡沫带、漂浮物等特征在权重表中已预留(10 / 20 分),尚未启用。

组合加分

  • 水流剪切线 + 反流区+10 分
  • 漩涡 + 反流区+10 分

两种特征叠在同一格,说明水流结构更复杂、滞留饵料更稳定, 所以额外加分。本次第一名的推荐区域正是「剪切线 + 反流」的组合。

评分等级

  • 90 分及以上★★★★★ 优先关注
  • 75 分及以上★★★★☆ 重点区域
  • 60 分及以上★★★☆☆ 值得尝试
  • 低于 60 分★★☆☆☆ 普通区域

本次实测结果

3 个推荐区域
与算法给出的原话

下面是算法对本段素材打分最高的几个区域,以及它自己生成的搜索建议 —— 原文照录,包括「以上为疑似特征,建议现场人工核实」这句。

1普通区域

46.9分★★☆☆☆
反流区水流剪切线

本区域疑似反流(置信度0.42),与周围水流夹角约146°、流速约37.1px/s;疑似水流剪切线(置信度0.55),走向约180°。(以上为疑似特征,建议现场人工核实)剪切线与反流交汇形成经典伏击结构,缓流侧饵料富集,是理想伏击点。建议沿剪切线缓流侧由下游向上游搜索。

2普通区域

40.0分★★☆☆☆
水流剪切线

本区域疑似水流剪切线(置信度1.00),走向约174°。(以上为疑似特征,建议现场人工核实)剪切线两侧流速差异明显,掠食鱼常潜伏在缓流一侧。建议沿剪切线缓流侧搜索。

3普通区域

40.0分★★☆☆☆
水流剪切线

本区域疑似水流剪切线(置信度1.00),走向约174°。(以上为疑似特征,建议现场人工核实)剪切线两侧流速差异明显,掠食鱼常潜伏在缓流一侧。建议沿剪切线缓流侧搜索。

全部 17 个检出特征

本次命中 水流剪切线 / 反流区
#类型置信度网格 (行,列)画面位置 (x, y)
1水流剪切线1.003, 240.9423, 0.2333
2水流剪切线1.004, 200.7885, 0.3000
3水流剪切线0.853, 20.0962, 0.2333
4水流剪切线0.8211, 240.9423, 0.7667
5水流剪切线0.558, 200.7885, 0.5667
6反流区0.753, 30.1346, 0.2333
7反流区0.537, 180.7115, 0.5000
8反流区0.476, 200.7885, 0.4333
9反流区0.476, 220.8654, 0.4333
10反流区0.451, 250.9808, 0.1000
11反流区0.421, 110.4423, 0.1000
12反流区0.421, 120.4808, 0.1000
13反流区0.423, 250.9808, 0.2333
14反流区0.428, 200.7885, 0.5667
15反流区0.429, 210.8269, 0.6333
16反流区0.429, 220.8654, 0.6333
17反流区0.401, 140.5577, 0.1000

置信度与坐标均为算法原始输出值;归一化坐标以 1280×720 为基准, 页面上按容器宽高等比换算,所以放大缩小后叠加层依然对齐。

使用前提

算法有前提
它最怕镜头在动

水流分析默认你拍的是静止的水面。镜头一动,整个画面的位移会被当成水流, 结果就不可信了。所以算法会先做一次拍摄稳定性自检。

本次素材的稳定性自检结果
  • 边缘残余运动 / 水流中位流速0.90(判定阈值 ≥ 1.2 视为运动镜头)
  • 水体方向一致性115.9°(越大越散乱,全局平移时反而很小)
  • 结论判定为固定机位,本次分析有效

固定机位

用支架,或把手机靠在栏杆、石头上。手持哪怕只有轻微晃动, 也会在光流场上叠出一层假水流。

十秒左右,水面占大半

不必拍长片。关键是水面在画面中的占比要足够大,算法需要足够的像素去算流速。

避开强反光角度

正对太阳时水面会过曝,过曝区域的纹理丢失、光流不可信 —— 算法会把这些像素整块剔除,能用的水面就变少了。

常见问题

水动力分析和钓鱼指数有什么区别?

两者解决的是不同阶段的问题。钓鱼指数回答「这片水今天值不值得去」——它按城市算,输入是气温、气压、风力等公开气象数据,每日 07:00 / 18:10 更新。水动力分析回答「到了水边这一竿打哪里」——它按点位算,输入是你自己拍的水面视频,是一次性的现场分析。

页面上 S、B、V 三个字母是什么意思?

S 是剪切线(Shear line)、B 是反流(Backflow)、V 是漩涡(Vortex)。这三个字母与配色和上游算法画出来的标注图完全一致,所以你可以把「算法叠加」和「上游原图」两种视图对照着看。

为什么这次只检出反流和剪切线,一个漩涡都没有?

因为这段素材里确实没有稳定成立的漩涡结构。漩涡要同时满足「周围一圈持续旋转」和「中心流速明显低于周围」两个条件,本次素材没有格子同时满足,算法就报 0。这一点上我们没有做任何修饰 —— 算法不会为了图表好看硬凑特征,报出来的数字就是它真实看到的东西。

拍视频有什么要求?

三条:一、机位固定(找个支架或靠着栏杆,别手持走拍);二、10 秒左右即可,画面里水面尽量占大部分;三、避开正对太阳的强反光角度。算法内置了拍摄稳定性检测,判定为运动镜头时会直接提示重拍,而不是给出一份不可信的分析。

这些推荐点位能直接用吗?

它们是有依据的起点,不是保证。算法输出的是「疑似」特征,风、镜头畸变、水面反光都会影响判断;建议到了现场先按推荐区域观察一分钟,确认水流结构确实存在再下竿。

这个结果是每天更新的吗?

不是。本页展示的是对一段真实素材的单次分析结果(素材 17270678.mp4,1280x720,10.5 秒),用于说明算法到底做了什么、输出长什么样。钓鱼指数才是每日两次自动更新的部分。

微信小程序 · 免费使用

出发前先确认
这里到底能不能钓。

实时禁钓地图、钓点分析与每日刷新的钓鱼指数。微信搜索「路亚钓鱼AI助手」或扫码即可打开。

实时禁钓区域与禁渔期 每日 07:00 / 18:10 更新钓鱼指数
路亚钓鱼AI助手小程序码

微信扫码打开

抖音扫码关注路亚AI

抖音扫码关注

用手机微信「扫一扫」小程序码即可打开;也可在微信内搜索小程序名。

说明:本页展示的是对一段真实拍摄素材的单次分析结果(17270678.mp4,1280x720,10.5 秒),由上游小程序的水动力分析算法 原样计算产出,未做人工修饰。算法输出的是疑似特征,风、镜头畸变与水面反光 都会影响判断,请到现场人工核实后再作钓。本页不构成鱼情承诺。

数据来源:build_hydro.py(原样调用上游 AILURE-XCX 的水动力分析算法,未改一行);结果图由素材视频17270678.mp4 的中间帧与算法标注产出,导入时间 2026-09-17。