OpenCV C++使用filter2D自定义锚点触发normalizeAnchor断言错误求助
Assertion failed (anchor.inside(Rect(0,0,ksize.width,ksize.height))) in cv::normalizeAnchor)
问题原因
该报错的触发核心和使用的OpenCV版本相关:
- 较老的OpenCV 2.x版本中,
normalizeAnchor函数的锚点自动调整逻辑仅在坐标等于-1时生效,其余负坐标不会被自动修正,会直接执行范围校验。 - 本次使用的是3×3尺寸的内核,校验规则要求锚点必须落在内核范围内,即满足
0 ≤ x < 3且0 ≤ y < 3。
你传入的Point(2,-2)中y坐标为-2,不等于-1不会被自动修正,不符合范围要求,因此触发断言报错。之前测试传入的Point(1,-1)中y坐标等于-1,会被自动修正为内核中心的y坐标1,符合范围要求,因此运行正常。
解决方案
可根据实际需求选择对应方案:
- 自定义锚点位置时,确保传入的x、y坐标都满足
≥0且< 对应内核的宽/高,3×3内核的合法锚点x取值为0、1、2,y取值为0、1、2。 - 如需直接使用内核中心作为锚点,直接传入
Point(-1,-1)即可,OpenCV会自动计算中心坐标。 - 如需使用特殊偏移的锚点,可先自行把负坐标转换为对应合法正坐标后再传入。
内容的提问来源于stack exchange,提问作者Đăng Quý
相关产品推荐
相关产品推荐

