FFmpeg中get_jaccarddist函数的Jaccard距离逻辑及相关疑问
FFmpeg signature_lookup.c中get_jaccarddist函数相关疑问解答
1. 无交集时jaccarddist为0的逻辑问题
首先要明确:FFmpeg里的get_jaccarddist函数名有误导性,它没有实现标准Jaccard距离,实际计算的是两个BagOfWords的交集元素数量。
当两个BagOfWords无交集时,交集数量为0,此时jaccarddist >= sc->thworddist不成立,正好符合“坏配对”的判定逻辑——因为交集为0说明两组特征完全不匹配,自然要被过滤掉。标准Jaccard距离是1 - (交集/并集),无交集时为1,但这里的实现是直接用交集计数作为匹配度指标,数值越高匹配度越高,逻辑是自洽的。
2. sc->thworddist的默认值
在FFmpeg源码的signature_init函数中,SignatureContext的thworddist默认值被设置为3。这个值是判定BagOfWords配对有效的最低交集数量阈值,只有当交集计数大于等于3时,才会被认为是可能的有效配对。
3. jaccarddist采用int类型的原因
因为这个函数计算的不是标准Jaccard距离(0-1区间的浮点数),而是交集元素的整数个数,用int类型完全足够,不需要浮点类型:
- 避免浮点运算的性能开销,符合FFmpeg追求高效音视频处理的设计方向;
- 整数比较比浮点数更精准,不会出现浮点精度误差导致的判断错误;
- 直接用交集计数作为匹配度指标,整数类型更贴合实际计算结果的属性。
内容的提问来源于stack exchange,提问作者stilloo
相关产品推荐
相关产品推荐

